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

你可能感兴趣的:(【python asyncio 运行报错】:raise RuntimeError(‘There is no current event loop in thread %r‘))