无法从正在运行的事件循环中调用asyncio.run()
我想使用asyncio获取网页html。
我在jupyter笔记本中运行以下代码:
import aiofilesimport aiohttp
from aiohttp import ClientSession
async def get_info(url, session):
resp = await session.request(method="GET", url=url)
resp.raise_for_status()
html = await resp.text(encoding='GB18030')
with open('test_asyncio.html', 'w', encoding='utf-8-sig') as f:
f.write(html)
return html
async def main(urls):
async with ClientSession() as session:
tasks = [get_info(url, session) for url in urls]
return await asyncio.gather(*tasks)
if __name__ == "__main__":
url = ['http://huanyuntianxiazh.fang.com/house/1010123799/housedetail.htm', 'http://zhaoshangyonghefu010.fang.com/house/1010126863/housedetail.htm']
result = asyncio.run(main(url))
但是,它返回 RuntimeError: asyncio.run() cannot be called from a running event
loop
问题是什么?
怎么解决呢?
回答:
该asyncio.run()
文件说:
当另一个异步事件循环在同一线程中运行时,无法调用此函数。
你的情况的问题是,jupyter(IPython中)已经运行的事件循环(对于IPython的≥7.0):
现在,您可以在IPython终端和笔记本中的顶层使用async /
await,在大多数情况下,它应该“正常工作”。将IPython更新到版本7+,将IPykernel更新到版本5+,您就可以开始比赛了。
这就是为什么您不需要在jupyter中自己启动事件循环,await main(url)
甚至可以在外部异步函数中直接调用的原因。
async def main(): print(1)
await main()
import asyncioasync def main():
print(1)
asyncio.run(main())
在您的代码中将给出:
url = ['url1', 'url2']result = await main(url)
for text in result:
pass # text contains your html (text) response
以上是 无法从正在运行的事件循环中调用asyncio.run() 的全部内容, 来源链接: utcz.com/qa/434339.html