事出有因
在jupyter中运行如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import asyncio
async def fake_page(url): print(f"faking:{url}") sleep_time = int(url.split('_')[-1]) await asyncio.sleep(sleep_time) print(f"OK:{url}") async def main(urls): for url in urls: await fake_page(url)
%time asyncio.run(main(['url1', 'url2', 'url3', 'url4']))
|
Bug现场
1
| RuntimeError: asyncio.run() cannot be called from a running event loop
|
迎刃而解
根因分析
参考了下列链接的内容:
初步结论是jupyter依赖tornado,默认启动了event loop。
实践求证
在jupyter中输入:
1 2 3 4 5 6
| import asyncio
asyncio.get_event_loop()
<_UnixSelectorEventLoop running=True closed=False debug=False>
|
在terminal中输入ipython,然后再输入下列内容:
1 2 3 4
| In [1]: import asyncio
In [2]: asyncio.get_event_loop() Out[2]: <_UnixSelectorEventLoop running=False closed=False debug=False>
|
结论:确实jupyter默认启动了event loop。
解决方式
在jupyter中输入并运行下列内容:
1 2 3 4
| !pip install nest_asyncio
import nest_asyncio nest_asyncio.apply()
|
再运行开头那段程序,报错解决。