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()
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.