无法从正在运行的事件循环中调用asyncio.run()

我想使用asyncio获取网页html。

我在jupyter笔记本中运行以下代码:

import aiofiles

import 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 asyncio

async 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

回到顶部