2017-10-19 95 views
1

我想我得到这个错误是因为我的代码调用asyncio.get_event_loop().run_until_complete(foo())两次。一旦从foo()第二次从函数调用foo()。那么我的问题是:为什么这会成为一个问题呢?为什么我更关心这个循环是否正在运行?RuntimeError:这个事件循环已经在Python中运行了


有这个问题,我认为它,做编辑,遮蔽它(有些人喜欢遵守规则不理解他们,从而从标题删除“非法”二字)。不幸的是,这造成了混乱。

我对提出错误的事实并不感到惊讶。我可以追溯到asyncio的来源,并看到这个图书馆的作者想这样做,那里没有神秘的东西。令人困惑的是,图书馆的作者认为,当循环已经运行时,要求事件循环运行一些函数以完成是非法的。

我们可以减少这个问题,只留下两个这样的电话,并通过案例分析,我们会发现这些都是三种可能性:

  1. 既不两种功能永远终止。
  2. 其中一个函数最终终止。
  3. 这两个函数最终都会终止。

现在,是否有任何适合所有三种情况的理智行为?对我而言,显而易见的是,在这里可能存在或者可能有多种理智的行为。例如:

  1. 没什么特别的,两个函数的执行都是交错的,并且它们一直保持运行,就像预期的一样。
  2. 以下的run_until_complete()第一个实例,直到第二函数完成(因此run_until_complete()后无代码将被执行的环路不控制返回给代码。
  3. 最后函数终止之后,循环将控制返回给所述第一代码对象,调用run_until_complete忽略其他所有调用站点。

现在,我可以理解这种行为可能不是东西,每个人都想要的。但是,因为该库决定给程序员控制起动/停止事件循环,它也应该能够满足这些决定的后果多次循环排除了库代码永远不会这样做,这降低了利用asyncio(这确实是例如aiohttp)的库的质量和实用性。

回答

2

事件循环运行 - 是异步程序的入口点。它管理所有协程,任务和回调的运行。在运行循环时没有任何意义:在某种程度上,就像试图从同一个已经运行的作业执行程序运行作业执行程序一样。

既然你有这个问题,我想你可能会误解asyncio的工作方式。请阅读this article - 这不是很大,并给出了一个很好的介绍。

UPD:

有中添加多的东西,而这个循环已经运行到被事件循环运行绝对没有问题。你可以只用等待它做到这一点:

await coro() # add coro() to be run by event loop blocking flow here until coro() is finished 

或创建任务:

asyncio.ensure_future(coro()) # add coro() to be run by event loop without blocking flow here 

正如你可以看到你不需要调用事件循环的方法,使一些被它跑了。

事件循环的方法,如run_foreverrun_until_complete - 只是一种启动事件循环的方法。

run_until_complete(foo())意思是:“添加foo()由事件循环运行并运行事件循环本身直到foo()未完成”。

+0

...但我没有运行事件循环,我运行'foo()'为什么我甚至不得不明确运行循环?谁会在地球上想要*那*?这就像用你的双手移动你的挂钟的手...让时间前进... – wvxvw

+0

重新'文章 - 谢谢你。我现在会读它。与任何将并发功能融入其设计的语言相比,“asyncio”在很多层面上都非常糟糕,以至于无法兑换。一切都很糟糕,设计,实现和文档...... Python总体来说是一种体面的语言,但是这个补充......我甚至不知道如何描述它。 – wvxvw

+0

那么,这篇文章是非常肤浅的,与夫妇你好 - 世界一级的例子,当应用到更现实的东西时不保水...:/ – wvxvw

相关问题