How to fix Python asyncio RuntimeError: There is no current event loop in thread ...
Problem:
You are trying to run your Python application, but you see an error message like
Traceback (most recent call last):
[...]
File "/mnt/KATranslationCheck/CrowdinLogin.py", line 38, in get_crowdin_tokens
return asyncio.get_event_loop().run_until_complete(async_get_crowdin_tokens(username, password))
File "/usr/lib/python3.6/asyncio/events.py", line 694, in get_event_loop
return get_event_loop_policy().get_event_loop()
File "/usr/lib/python3.6/asyncio/events.py", line 602, in get_event_loop
% threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'worker 3'.
Solution
You are trying to run asyncio.get_event_loop()
in some thread other than the main thread - however, asyncio only generates an event loop for the main thread.
Use this function instead of asyncio.get_event_loop()
:
import asyncio
def get_or_create_eventloop():
try:
return asyncio.get_event_loop()
except RuntimeError as ex:
if "There is no current event loop in thread" in str(ex):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
return asyncio.get_event_loop()
else:
raise ex
It will first try asyncio.get_event_loop()
. In case that doesn’t work, it will generate a new event loop for the current thread using
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
and then returns this event loop.
Note that while this works well for generating the event loop, but depending on the way you use the event loop, you might encounter further error messages like
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/pyppeteer/launcher.py", line 305, in launch
return await Launcher(options, **kwargs).launch()
File "/usr/local/lib/python3.6/dist-packages/pyppeteer/launcher.py", line 157, in launch
signal.signal(signal.SIGINT, _close_process)
File "/usr/lib/python3.6/signal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread
that are usually not as easy to fix and require some restructuring of your program.