【python asyncio 运行报错】:raise RuntimeError(‘There is no current event loop in thread %r‘)

本文介绍了一个关于Python asyncio模块在使用多个协程时遇到的常见错误:主线程中找不到当前事件循环,并提供了解决方案。通过创建新的事件循环并设置为当前线程的事件循环,可以避免协程间的相互干扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码:

# 执行第一个协程程序
asyncio.run(S.crawl_url())

select_date = S.select_date()
select_keyword = S.select_keyword(select_date)  # 列表

# 第二个协程
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([S.parse_html(url) for url in select_keyword]))
loop.close()

报错:

raise RuntimeError('There is no current event loop in thread %r.

’ RuntimeError: There is no current event loop in thread ‘MainThread’.

翻译:

引发RuntimeError(‘线程%r中没有当前事件循环。’)

在主线程中没有当前事件循环。

出现错误原因:

asyncio仅为主线程生成一个事件循环,

猜测:我在代码中,执行这个协程之前还有一个协程调用,下面的 loop = asyncio.get_event_loop() 并没有获取到事件循环,所以导致报错:在主线程没有事件循环。简单说,就是在同一线程中,第二个协程受到第一个的干扰。

因为,当我将上面的第一个协程代码注释掉后,下面的代码就不会报错。

解决办法:

在第二个协程获取事件循环前添加下面两行代码

new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)

修改后代码:

# 执行第一个协程程序
asyncio.run(S.crawl_url())

select_date = S.select_date()
select_keyword = S.select_keyword(select_date)  # 列表

# 第二个协程
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([S.parse_html(url) for url in select_keyword]))
loop.close()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值