由于数据处理的需要,我想在Ipython笔记本中运行的当前循环中等待一组任务的结果。在Ipython笔记本中,
默认情况下,事件循环正在运行。也就是说,只要您运行下面的代码,您就会得到True
import asyncio
loop = asyncio.get_event_loop()
loop.is_running()
由于笔记本计算机正在使用它,因此您无法关闭当前循环。我在Ipython Notebook中有一些任务要做。但是我不能在不关闭当前循环的情况下创建新循环。 我几乎实现了它。这是我的方法:
import asyncio as aio
loop = aio.get_event_loop()
async def hello():
await aio.sleep(10)
return "hello"
tasks = []
for i in range(10):
tasks.append(loop.create_task(hello()))
# all the tasks will automatically run
rest = aio.gather(*tasks)
现在我需要做的是等待rest
完成,但是,我无法使用loop.run_until_complete
来完成它,因为我无法关闭当前笔记本循环。
我应该怎么做才能得到结果? 谢谢。
答案 0 :(得分:1)
只需创建一个新的事件循环并将其设置为当前事件循环即可。我无法重现您的问题,请参见下文,因此请注意,这是未经测试的:
import asyncio as aio
loop = aio.new_event_loop()
aio.set_event_loop(loop)
然后,您应该能够安全地调用loop.run_until_complete(rest)
,而不会干扰默认的事件循环。
有关详细信息,请参阅文档:https://docs.python.org/3/library/asyncio-eventloop.html
我不确定您使用的是哪个版本的IPython / Jupyter笔记本,但是在Mac OS High Sierra上的Jupyter笔记本4.4版或IPython 6.2.1版中无法重现该问题。请注意,长期以来不推荐使用IPython笔记本,而推荐使用Jupyter笔记本。
jMatthews-MacBook-Pro:stackoverflow matt$ jupyter --version
4.4.0
Matthews-MacBook-Pro:stackoverflow matt$ ipython --version
6.2.1
例如,在运行ipython
REPL时:
In [1]: import asyncio
...: loop = asyncio.get_event_loop()
...: loop.is_running()
...:
Out[1]: False
Jupyter笔记本中的类似输出。