我想我得到这个错误是因为我的代码调用 asyncio.get_event_loop().run_until_complete(foo())
两次。一次来自 foo()
,第二次来自 foo()
调用的函数。那么我的问题是: 为什么这会成为一个问题?我为什么要关心这个循环是否正在运行?
这个问题有一个编辑,我认为,模糊了它(一些人喜欢遵循规则,而不理解他们,因此从标题中删除了一个“非法”字)。不幸的是,这造成了混乱。
对于错误被提出这一事实,我并不感到惊讶。我可以追溯到 asyncio
的源代码,看到这个图书馆的作者想要这样做,没有什么神秘的。令人费解的部分在于,当循环已经在运行时,库的作者认为从事件循环请求运行某个函数直到完成是非法的。
我们可以将问题简化为两个这样的呼吁,通过案例分析,我们将看到这是三种可能性:
那么,有没有什么正常的行为可以解决这三个案子呢?对我来说,很明显,这里可能存在,或者可能存在多种理智的行为。例如:
run_until_complete()
的第一个实例之后的代码(因此在 run_until_complete()
之后不会执行任何代码)。run_until_complete
的代码对象,该代码对象忽略所有其他调用站点。现在,我可以理解这种行为可能不是每个人都想要的。但是,由于这个库决定让程序员控制启动/停止事件循环,因此它也应该满足这种决定的后果。多次启动同一个循环是一个错误,这使得库代码无法这样做,从而降低了使用 asyncio
的库的质量和有用性(例如,aiohttp
就是这种情况)。