代码:
# 执行第一个协程程序
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()