Python 3.10 asyncio.gather()显示DeprecationWarning:没有当前事件循环



我有一个Django应用程序,在它的一个视图中,我使用asyncio向外部组件发出一些并发请求。

想法如下:

import asyncio

async def do_request(project):
result = ...
return result
def aggregate_results(projects: list):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
results = loop.run_until_complete(
asyncio.gather(*(do_request(project) for project in projects))
)
loop.close()
return zip(projects, results)

好吧,当我运行测试时,我在以下行得到DeprecationWarning: There is no current event loop

asyncio.gather(*(do_request(project) for project in projects))

我应该如何解释这个警告,我需要改变什么来消除它?谢谢

根据文档,发生这种情况是因为在调用gather时没有事件循环运行。

自3.10版本起已弃用:如果未提供位置参数,或者不是所有位置参数都是类似Future的对象,并且没有运行事件循环,则会发出弃用警告。

您可能已经注意到,您的代码是有效的。它将继续工作,只要使用3.10,您就可以忽略弃用警告。不过,在未来的某个时刻,这可能会变为运行时错误。

请耐心等待,建议使用run而不是loop.run_until_complete来运行事件循环。

def aggregate_results(projects: list):
results = asyncio.run(asyncio.gather(*(do_request(project) for project in projects)))
return zip(projects, results)

然而,这实际上是行不通的。相反,你会得到一个异常

ValueError: a coroutine was expected, got <_GatheringFuture pending>

修复方法是等待来自另一个协同程序的gather

async def get_project_results(projects: list):
results = await asyncio.gather(*(do_request(project) for project in projects))
return results
def aggregate_results(projects: list):
results = asyncio.run(get_project_results(projects))
return zip(projects, results)

(您也可以将get_project_results与您的aggregate_results版本一起使用。(

相关内容

  • 没有找到相关文章

最新更新