如何等待当前运行循环中的任务完成?

时间:2018-08-17 15:48:11

标签: python python-3.x python-asyncio

由于数据处理的需要,我想在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来完成它,因为我无法关闭当前笔记本循环。

我应该怎么做才能得到结果? 谢谢。

1 个答案:

答案 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笔记本中的类似输出。