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())

代码解释:

  1. 使用 try...except 块捕获 RuntimeError 异常。
  2. 如果异常信息中包含 'no current event loop',则说明当前没有事件循环在运行,此时创建新的事件循环对象。
  3. 如果没有异常,则直接使用已有的事件循环对象。
  4. 最后,使用 loop.run_until_complete(main()) 启动事件循环并执行协程函数 main()

总结:

RuntimeError: 'This event loop is already running' 错误通常是由于代码中重复创建事件循环对象导致的。通过在代码开始时先判断是否有事件循环在运行,并根据情况选择创建新的事件循环对象或使用已有的事件循环对象,可以有效地避免此类错误。

Python asyncio 协程 RuntimeError: This event loop is already running 错误解决

原文地址: https://www.cveoy.top/t/topic/ojeO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录