Python 3.10 asyncio.gather() 显示 DeprecationWarning : There is no current event loop

标签 python python-asyncio python-3.10

我有一个 Django 应用程序,在它的一个 View 中,我使用 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))

我应该如何解释这个警告以及我需要更改什么才能摆脱它?谢谢!

最佳答案

根据documentation ,发生这种情况是因为当您调用 gather没有事件循环运行。

Deprecated since version 3.10: Deprecation warning is emitted if no positional arguments are provided or not all positional arguments are Future-like objects and there is no running event loop.

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

请耐心等待,the recommended way to run an event loop is with 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)

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

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 版本一起使用。)

关于Python 3.10 asyncio.gather() 显示 DeprecationWarning : There is no current event loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70303895/

相关文章:

python - 可以使用 exec 运行异步功能吗?

python-3.x - 运行时错误 : Event loop is running

python - PyTorch 安装要求 python=3.1 。安装的Python版本: 3. 10.0

python - 使用 for 循环和 if 语句的最长重复子串

python - 类型错误 : f0() takes 1 positional argument but 9 were given

python - keras中的神经网络不收敛

python - 旋转数据框的行

python-3.x - micropython中具有多种方法的asyncio

python - 带有 Python : 3. 10.0b4 的 PyInstaller - 导入错误:没有名为 _bootlocale 的模块

python - Pymunk body 对象有问题