Beheben: Python asyncio RuntimeError: There is no current event loop in thread ...

English Deutsch

Problem:

Sie versuchen, Ihre Python-Anwendung auszuführen, aber sehen eine Fehlermeldung wie

traceback.txt
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():

get_or_create_eventloop.py
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

Sie versucht zuerst asyncio.get_event_loop(). Falls das nicht funktioniert, wird ein neuer Event Loop für den aktuellen Thread generiert mit

new_event_loop.py
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

pyppeteer_signal_error.txt
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

die normalerweise nicht so einfach zu beheben sind und eine Umstrukturierung Ihres Programms erfordern.


Check out similar posts by category: Python