如何修复 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
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow