Python asyncio 协程 RuntimeError: This event loop is already running 错误解决
Python asyncio 协程 RuntimeError: 'This event loop is already running' 错误解决
在使用 Python asyncio 协程时,有时会遇到 RuntimeError: 'This event loop is already running' 的错误。该错误通常出现在代码中尝试创建新的事件循环对象时,而之前已经有一个事件循环在运行。
错误示例:
import asyncio
async def request(url):
print('开始解析url', url)
print('解析url完成', url)
c = request('www.baidu.com')
# 创建事件循环对象
loop = asyncio.get_event_loop()
# 将协程对象注册到 loop 中,然后启动 loop
loop.run_until_complete(c)
错误原因:
问题在于在创建事件循环对象 loop 之前,已经有一个事件循环在运行中了。
解决方法:
可以在代码开始时先判断是否有事件循环在运行中,如果有则直接使用已有的事件循环对象,否则再创建新的事件循环对象。例如:
import asyncio
async def request(url):
print('开始解析url', url)
print('解析url完成', url)
async def main():
c = request('www.baidu.com')
await c
if __name__ == '__main__':
# 判断是否有事件循环在运行中
try:
loop = asyncio.get_event_loop()
except RuntimeError as ex:
if 'no current event loop' in str(ex):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(main())
代码解释:
- 使用
try...except块捕获RuntimeError异常。 - 如果异常信息中包含
'no current event loop',则说明当前没有事件循环在运行,此时创建新的事件循环对象。 - 如果没有异常,则直接使用已有的事件循环对象。
- 最后,使用
loop.run_until_complete(main())启动事件循环并执行协程函数main()。
总结:
RuntimeError: 'This event loop is already running' 错误通常是由于代码中重复创建事件循环对象导致的。通过在代码开始时先判断是否有事件循环在运行,并根据情况选择创建新的事件循环对象或使用已有的事件循环对象,可以有效地避免此类错误。
原文地址: https://www.cveoy.top/t/topic/ojeO 著作权归作者所有。请勿转载和采集!