如何修复 Python asyncio RuntimeError: There is no current event loop in thread ...

问题:

你正在尝试运行你的 Python 应用程序,但你看到类似这样的错误消息

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'.

解决方案

你正在尝试在主线程以外的某个线程中运行 asyncio.get_event_loop() - 然而,asyncio 只为主线程生成事件循环。

使用此函数代替 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

它将首先尝试 asyncio.get_event_loop()。如果不起作用,它将使用以下命令为当前线程生成新的事件循环

new_event_loop.py
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

然后返回此事件循环。

注意虽然这适用于生成事件循环,但根据你使用事件循环的方式,你可能会遇到进一步的错误消息,如

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

这些通常不容易修复,需要对你的程序进行一些重构。


Check out similar posts by category: Python