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

代码:

# 执行第一个协程程序
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()
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值