事出有因

在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'])) # %time是jupyter的语法

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

再运行开头那段程序,报错解决。


本站由 sswfive 使用 Stellar 1.42.0 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站总访问量