跳到内容

带有超时的异步函数 (ASYNC109)

派生自 flake8-async linter。

作用

检查带有 timeout 参数的 async 函数定义。

为什么这不好?

与其手动实现异步超时行为,不如使用内置的超时功能,例如 asyncio.timeouttrio.fail_afteranyio.move_on_after 等。

这条规则非常主观,旨在强制执行一种名为“结构化并发”的设计模式,该模式允许 async 函数忽略超时,而是让调用者使用上下文管理器处理逻辑。

详情

此规则尝试通过分析它正在检查的文件中的导入来检测您的代码正在使用的异步框架。如果在您的代码中看到 anyio 导入,它将假定 anyio 是您选择的框架;如果看到 trio 导入,它将假定 trio;如果两者都看不到,它将假定 asyncioasyncio.timeout 是在 Python 3.11 中添加的,因此如果检测到 asyncio 作为正在使用的框架,则当您的配置target-version 设置为低于 Python 3.11 时,将忽略此规则。

对于包装 asyncio.timeouttrio.fail_afteranyio.move_on_after 的函数,可以通过使用不同的参数名称来避免此规则的误报。

示例

async def long_running_task(timeout): ...


async def main():
    await long_running_task(timeout=2)

建议改为

async def long_running_task(): ...


async def main():
    async with asyncio.timeout(2):
        await long_running_task()

参考