协程与任务

您所在的位置:网站首页 python启动方法 协程与任务

协程与任务

2023-10-24 10:06| 来源: 网络整理| 查看: 265

任务组¶

任务组合并了一套用于等待分组中所有任务完成的方便可靠方式的任务创建 API。

class asyncio.TaskGroup¶

持有一个任务分组的 异步上下文管理器。 可以使用 create_task() 将任务添加到分组中。 当该上下文管理器退出时所有任务都将被等待。

3.11 新版功能.

create_task(coro, *, name=None, context=None)¶

在该任务组中创建一个任务。 其签名与 asyncio.create_task() 的相匹配。

示例:

async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print(f"Both tasks have completed now: {task1.result()}, {task2.result()}")

async with 语句将等待分组中的所有任务结束。 在等待期间,仍可将新任务添加到分组中 (例如,通过将 tg 传入某个协程并在该协程中调用 tg.create_task())。 一旦最后的任务完成并退出 async with 代码块,将无法再向分组添加新任务。

当首次有任何属于分组的任务因 asyncio.CancelledError 以外的异常而失败时,分组中的剩余任务将被取消。 在此之后将无法添加更多任务到该分组中。 在这种情况下,如果 async with 语句体仍然为激活状态(即 __aexit__() 尚未被调用),则直接包含 async with 语句的任务也会被取消。 结果 asyncio.CancelledError 将中断一个 await,但它将不会跳出包含的 async with 语句。

一旦所有任务被完成,如果有任何任务因 asyncio.CancelledError 以外的异常而失败,这些异常会被组合在 ExceptionGroup 或 BaseExceptionGroup 中(选择其中较适合的一个;参见其文档)并将随后引发。

两个基础异常会被特别对待:如果有任何任务因 KeyboardInterrupt 或 SystemExit 而失败,任务分组仍然会取消剩余的任务并等待它们,但随后初始 KeyboardInterrupt 或 SystemExit 而不是 ExceptionGroup 或 BaseExceptionGroup 会被重新引发。

如果 async with 语句体因异常而退出(这样将调用 __aexit__() 并附带一个异常),此种情况会与有任务失败时一样对待:剩余任务将被取消然后被等待,而非取消类异常会被加入到一个异常分组并被引发。 传入到 __aexit__() 的异常,除了 asyncio.CancelledError 以外,也都会被包括在该异常分组中。 同样的特殊对待也适用于上一段所说的 KeyboardInterrupt 和 SystemExit。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3