首页 > 其他分享 >async.gather()

async.gather()

时间:2024-12-21 12:31:29浏览次数:3  
标签:await gather 任务 Task async asyncio wait

在 Python 的 asyncio 模块中,await asyncio.gather(*tasks)await asyncio.wait(task_list) 都用于等待多个异步任务完成,但它们在功能、用法和行为上有一些细微的区别。下面我会详细解释它们的不同之处。

1. asyncio.gather(*tasks)

asyncio.gather(*tasks) 是一个非常常用的方法,用于并发执行多个异步任务,并等待它们全部完成。它会返回一个结果列表,其中每个元素对应每个任务的返回值。如果某个任务抛出了异常,gather() 会立即抛出异常,且会在所有任务中传播异常。

特点

  • 返回值: 如果所有任务成功完成,gather() 返回一个包含每个任务结果的列表。
  • 异常传播: 如果某个任务抛出了异常,gather() 会立刻抛出该异常,并且不会返回其他任务的结果,除非在捕获异常的上下文中处理它。
  • 顺序保证: 返回的结果列表的顺序与任务传入的顺序一致,即使任务的执行顺序不同,返回值的顺序也会与传入时的顺序一致。

示例

import asyncio

async def task1():
    await asyncio.sleep(1)
    return "Task 1 complete"

async def task2():
    await asyncio.sleep(2)
    return "Task 2 complete"

async def main():
    results = await asyncio.gather(task1(), task2())
    print(results)  # ['Task 1 complete', 'Task 2 complete']

asyncio.run(main())

如果某个任务抛出异常,gather() 会立刻传播该异常。

async def task1():
    await asyncio.sleep(1)
    return "Task 1 complete"

async def task2():
    await asyncio.sleep(2)
    raise ValueError("Task 2 failed!")

async def main():
    try:
        results = await asyncio.gather(task1(), task2())
    except Exception as e:
        print(f"Error: {e}")

asyncio.run(main())  # Output: Error: Task 2 failed!

2. asyncio.wait(task_list)

asyncio.wait(task_list) 是一个低级的 API,用于等待一个任务集合中的任务完成。它返回一个包含两组任务的元组:一组是已经完成的任务,另一组是仍然未完成的任务。wait() 更加灵活,可以用于控制任务的执行状态,但它并不会返回任务的结果。

特点

  • 返回值: 返回一个二元组 (done, pending),其中 done 是已完成的任务,pending 是仍然在等待的任务。donepending 都是 set 类型。
  • 异常处理: asyncio.wait() 不会自动抛出异常。你需要单独处理任务中的异常。
  • 可自定义行为: asyncio.wait() 允许你设置如何等待任务完成,比如设置 timeout 或者通过 return_when 参数来控制如何完成等待(例如:asyncio.FIRST_COMPLETEDasyncio.FIRST_EXCEPTION)。

示例

import asyncio

async def task1():
    await asyncio.sleep(1)
    return "Task 1 complete"

async def task2():
    await asyncio.sleep(2)
    return "Task 2 complete"

async def main():
    tasks = [task1(), task2()]
    done, pending = await asyncio.wait(tasks)

    # 查看已经完成的任务
    for task in done:
        print(task.result())  # Output: Task 1 complete / Task 2 complete

asyncio.run(main())

asyncio.wait() 的更多控制

asyncio.wait() 提供了额外的控制选项,通过 return_when 参数,你可以选择等待所有任务完成或等待第一个任务完成。

done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
  • asyncio.FIRST_COMPLETED:返回第一个完成的任务。
  • asyncio.FIRST_EXCEPTION:返回第一个抛出异常的任务。
  • asyncio.ALL_COMPLETED:等待所有任务完成(这是默认行为)。

主要区别

特性 asyncio.gather(*tasks) asyncio.wait(task_list)
返回值 返回任务的结果列表。 返回二元组 (done, pending),分别是已完成的任务和未完成的任务。
异常处理 如果有任务抛出异常,gather 会立刻抛出异常,其他任务的结果不会返回。 需要手动处理任务的异常。
任务顺序 返回的结果顺序与传入任务的顺序一致。 不保证顺序。
控制选项 没有 return_when 选项,等待所有任务完成。 提供 return_when 参数,允许等待某个特定的任务状态。
适用场景 用于需要获取所有任务结果并且确保任务按顺序完成的情况。 用于需要更细粒度控制任务执行过程(如超时、等待第一个完成等)的情况。

总结

  • asyncio.gather() 是一个更高级的、用于等待任务完成并收集结果的方法,适合于需要获取所有任务结果并保证顺序的情况。
  • asyncio.wait() 提供更多控制和灵活性,适合于需要精确控制任务执行顺序、等待任务完成状态或需要处理任务异常的情况。

选择哪个方法取决于你的需求:

  • 如果你只需要等待任务完成并获取结果,使用 gather() 更简单。
  • 如果你需要更多控制(比如超时、处理异常或等待第一个任务完成),则使用 wait()

标签:await,gather,任务,Task,async,asyncio,wait
From: https://www.cnblogs.com/cloud-2-jane/p/18620635

相关文章

  • ES6 async await只能保证async内部顺序调用顺序
    ES6asyncawait只能保证async内部顺序调用顺序引言基本概念与作用说明Async函数Await运算符内部操作顺序调用顺序示例一:简单的async函数示例二:多个async函数的调用示例三:控制调用顺序示例四:并行与顺序结合示例五:错误处理不同角度的功能使用思路API请求管理数据预加载......
  • 如果 Microsoft Dynamics CRM 中的 AsyncOperationBase 表变得太大,性能会变慢
    原文PerformanceisslowiftheAsyncOperationBasetablebecomestoolargeinMicrosoftDynamicsCRM-MicrosoftSupportSymptoms当您运行MicrosoftDynamicsCRM4.0、MicrosoftDynamicsCRM2011、MicrosoftDynamicsCRM2013或MicrosoftDynamicsCRM2015时,As......
  • 深入聊聊async&Promise
    正文最近在学习JavaScript里的async、await异步,对于其中的Promise状态以及背后的Js引擎实际运行状态不大理解且很感兴趣,因此花了一点时间仔细研究了一下。从Example说起constcreateImg=function(path){returnnewPromise((resolve,reject)=>{constimg=docu......
  • .net core中异步async await
    基本原理async,await是C#语言中用于简化异步操作的语法糖,实际会由编译器将代码翻译生成状态机来执行异步操作。状态机是一种数学模型,用于描述一个系统在不同状态之间的转换行为。它由一组状态和一组转换组成,在特定的输入条件下,系统从一个状态转换到另一个状态。例如如下的异......
  • 你不知道的 async、await 魔鬼细节
    0、前言关于promise、async/await的使用相信很多小伙伴都比较熟悉了,但是提到事件循环机制输出结果类似的题目,你敢说都会?asyncfunctionasync1(){awaitnewPromise((resolve,reject)=>{resolve()})console.log('A')}async1()newPromi......
  • 浅析 C# Async 和 Await 【代码之美系列】
    文章目录一、引言......
  • CloseableHttpAsyncClient使用代理问题记录
    目录场景背景问题解决过程解决方案总结场景背景项目A部署到现场后,甲方要求调用接口上传某些数据给他们。问题代码很快就开发完成了,但是领导要求必须想办法调用一次测试一次,而且现场没有测试环境(测试当生产用),只能本地使用VPN然后再调用接口测试。VPN本身很多坑就不说了,后面VP......
  • 前端的 Python 入门指南(七):异步场景的实现方案对比 - 内置+显示事件循环 + async+await
    《前端的Python入门指南》系列文章:(一):常用语法和关键字对比(二):函数的定义、参数、作用域对比(三):数据类型对比-彻底的一切皆对象实现和包装对象异同(四):参数传递方式对比-值与引用传递vs可变不可变数据(五):面向对象特性之继承实现的方式对比-基于原型链和基于类各有什么......
  • 第十四章:深度解密 async/await 与 Task 的底层原理
    第十四章:深度解密async/await与Task的底层原理目录第十四章:深度解密async/await与Task的底层原理14.1引言:从回调地狱到async/await1.从回调函数到事件驱动:早期的异步编程模型1.1回调函数(Callback)的局限性1.2基于事件的异步模式(EAP)1.3任务并行库(TPL)和Task的引入2.......
  • c++ 中异步闲谈:async,await,future, promise的使用和注意事项
    《C++异步妙韵》C++异步展新章,async开启并行航。函数异步去闯荡,不必同步苦守望。future犹如希望光,异步结果有处藏。等待之时心不慌,获取成果见真章。promise把诺来担当,结果设定不迷茫。与future紧捆绑,异步流程稳起航。await恰似静候郎,future前面来......