Beheben: Python asyncio RuntimeError: There is no current event loop in thread ...
Problem:
Sie versuchen, Ihre Python-Anwendung auszuführen, aber sehen eine Fehlermeldung wie
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'.Lösung
Sie versuchen, asyncio.get_event_loop() in einem anderen Thread als dem Haupt-Thread aufzurufen – asyncio generiert jedoch nur einen Event Loop für den Haupt-Thread.
Verwenden Sie diese Funktion anstelle von 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 exSie versucht zuerst asyncio.get_event_loop(). Falls das nicht funktioniert, wird ein neuer Event Loop für den aktuellen Thread generiert mit
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)und gibt dann diesen Event Loop zurück.
Beachten Sie, dass dies zwar gut zum Generieren des Event Loops funktioniert, aber je nachdem, wie Sie den Event Loop verwenden, könnten weitere Fehlermeldungen auftreten wie
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 threaddie normalerweise nicht so einfach zu beheben sind und eine Umstrukturierung Ihres Programms erfordern.