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