async.gather()

news/2024/12/21 12:25:57/文章来源:https://www.cnblogs.com/cloud-2-jane/p/18620635

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

1. asyncio.gather(*tasks)

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

特点

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

示例

import asyncioasync 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 asyncioasync 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 completeasyncio.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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856295.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第十三周学习总结

学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第十三周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十三周作业)这个作业…

纪念 Jonathan Barzilai

我在读博期间研究了关于非线性优化算法中的Barzilai-Borwein(BB)步长。正如我的导师安老师所言:梯度下降法是优化算法的基石(只考虑一般可微的目标函数)。在该算法中,迭代点每次沿着当前的负梯度方向"走一步",一直迭代下去,逼近最优解(当然是局部的)。一个自然地…

省选数学专题

昌吉市传教士出金身难度升序排序(大概吧)。 [AGC016C] +/- Rectangle 签,虽然国集作业。 贪心是显然的,不说了,这里只考虑正数如何填。 如果\(H\times W-\left\lfloor\frac{H}{h}\right\rfloor\times h\times \left\lfloor\frac{W}{w}\right\rfloor\times w\le \left\lflo…

《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验

第四十五章 人脸识别实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/A…

【寒武纪mlu220模型移植】(一)目标检测YoLoV8

前言:目标检测可能是大家用的比较多的,先完善这一篇吧。yolov5的导出可以参考官方文档。并且博主比较懒,已经做过一遍的事情,不想验证第二遍,如果有步骤错误或者疏漏导致中间遇到了问题,可以先自己debug,流程大致就是这样的。 一、修改源码首先是拉取yolov8最新的源码,…

基于钜泉计量AD的电表应用专题推荐(ATT7053D、HT7136、HT7627S-E

关于电力仪表上应用专题介绍,钜泉电能计量、PA驱动、Flash存储HiTrend(钜泉)电能计量芯片 单相计量ADC:ATT7053D,ATT7053C,HT7017,HT7017C 三相计量ADC:HT7036、HT7038、ATT7022E、HT7136、HT7132、HT7032-L 单相计量SOC:HT5019、HT5017,HT5025、HT5029,HT5033,HT503…

AI视频抠图来了!还可以替换视频背景,附下载链接

虽然人工智能正在飞速发展中,图像处理技术也在不断升级,但视频背景去除一直都是图像处理任务中最具挑战性的难题之一 Clipper是一款专注于高精度图像分割的AI工具,用于图像和视频的背景去除,允许用户直接输出透明背景(自定义颜色)的视频文件,还提供用一张图片或者其它视…

习题10.3

import numpy as np import statsmodels.formula.api as smf import matplotlib.pyplot as plt# 加载数据 a = np.loadtxt(data10_3.txt)# 设置绘图参数 plt.rc(text, usetex=True) # 启用 LaTeX 字体 plt.rc(font, size=16) # 设置字体大小 plt.style.use(default) # 使用默…

浅谈一下本机、服务器、docker-compose 容器之间网络通信

一、首先,先区分四个对象,它们分别有自己的网络 1、云服务器上,应用服务容器网络(app,nginx,mysql,redis等)app.net 2、云服务器上,模型服务容器网络(ai服务) 模型网络 ai.net 3、云服务器上:宿主机网络(服务器本机) 服务器本机网络 host.net 4、本机:本地网络 loca…

习题10.1

import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt def check(data): # 提取数据的第一列和第二列 x = data[:, 0] y = data[:, 1] # 使用statsmodels进行线性回归分析 model = sm.OLS(y, sm.add_constant(x)).fit() # 添加常数项 print(mode…

static修饰成员的特点及static修饰成员变量内存图解-java se进阶 day01

1.static介绍 static是静态的意思,它可以用于修饰成员变量和成员方法2.static的特点1.被static修饰了的成员变量,可以被类中的所有对象所共享 虽然stu02没有给school赋值,但是我们用stu02调用时依旧成立,并且打印了南昌交通学院,因为school被共享了,恰好stu01又为其赋值了…

IIS运行遇到问题

1:打开网站时出现的错误提示2:下载对应的.net core Runtime后正常,如下图所示