`asyncio.wait` 和 `asyncio.gather` 的区别

`asyncio.wait` 和 `asyncio.gather` 的区别

        • 1. `asyncio.wait`
        • 2. `asyncio.gather`
        • 主要区别
        • 总结

在Python的异步编程中,asyncio.waitasyncio.gather 都是用于等待多个异步任务完成的工具,但它们在功能和使用方式上有一些关键的区别。本文将详细解释这两个函数的不同之处。

1. asyncio.wait

asyncio.wait 是一个低级别的API,用于等待一组任务完成。它返回两个集合:已完成的任务和未完成的任务。

语法:

done, pending = await asyncio.wait(tasks, timeout=None, return_when=asyncio.ALL_COMPLETED)

参数:

  • tasks:一个包含异步任务的可迭代对象。
  • timeout:可选参数,指定等待的最大时间(秒)。如果超时,未完成的任务将包含在pending中。
  • return_when:指定何时返回结果。可以是以下值之一:
    • asyncio.ALL_COMPLETED:等待所有任务完成(默认)。
    • asyncio.FIRST_COMPLETED:等待第一个任务完成。
    • asyncio.FIRST_EXCEPTION:等待第一个引发异常的任务。

返回值:

  • done:一个集合,包含所有已完成的任务。
  • pending:一个集合,包含所有未完成的任务(如果超时)。

示例:

import asyncioasync def func():print(1)await asyncio.sleep(2)print(2)return "返回值"async def main():task_list = [asyncio.create_task(func()),asyncio.create_task(func())]done, pending = await asyncio.wait(task_list)for task in done:print(task.result())asyncio.run(main())
2. asyncio.gather

asyncio.gather 是一个更高级别的API,用于并发运行多个异步任务,并返回它们的结果列表。它等待所有任务完成,并返回一个包含所有结果的列表。

语法:

results = await asyncio.gather(*tasks, return_exceptions=False)

参数:

  • *tasks:一个或多个异步任务。
  • return_exceptions:可选参数,指定是否将异常作为结果返回。如果为False(默认),异常会传播到调用者;如果为True,异常会被捕获并作为结果返回。

返回值:

  • results:一个列表,包含所有任务的结果。如果某个任务引发异常且return_exceptions=True,异常对象将作为结果返回。

示例:

import asyncioasync def func():print(1)await asyncio.sleep(2)print(2)return "返回值"async def main():results = await asyncio.gather(func(), func())for result in results:print(result)asyncio.run(main())
主要区别
  1. 返回值格式

    • asyncio.wait 返回两个集合:donepending
    • asyncio.gather 返回一个包含所有任务结果的列表。
  2. 异常处理

    • asyncio.wait 不会自动捕获异常,异常会传播到调用者。
    • asyncio.gather 可以通过设置 return_exceptions=True 来捕获异常并将其作为结果返回。
  3. 使用场景

    • asyncio.wait 适用于需要更细粒度控制任务完成情况的场景,例如需要处理未完成的任务或根据任务完成顺序进行操作。
    • asyncio.gather 适用于简单地等待所有任务完成并获取结果的场景。
总结
  • asyncio.wait:低级别API,返回两个集合(已完成的任务和未完成的任务),适用于需要细粒度控制任务完成情况的场景。
  • asyncio.gather:高级别API,返回一个包含所有任务结果的列表,适用于简单地等待所有任务完成并获取结果的场景。

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

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

相关文章

48-基于单片机的LCD12864时间调控和串口抱站

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机的公交报站系统,可以手动报站,站名十个。 在lcd12864上显示时间(年月日时分秒)和站名,时间可以设置, 仿真中可以…

如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间

如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间 一、前言二、准备工作三、扩展逻辑卷1. 检查现有 LVM 配置2. 扩展物理卷3. 扩展卷组4. 扩展逻辑卷四、调整文件系统大小1. 检查文件系统状态2. 扩展文件系统五、处理可能出现的问题1. 文件系统无法扩展2. 磁盘空间不足3…

爬虫框架快速入门——Scrapy

适用人群:零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy? Scrapy 是一个基于 Python 的网络爬虫框架,它能帮助你快速爬取网站上的数据,并将数据保存到文件或数据库中。 特点: 高效:支…

Redis 分布式锁实现方案

一、概述 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级…

前端node.js

一.什么是node.js 官网解释:Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 二.初步使用node.js 需要区分开的是node.js和javascript互通的只有console和定时器两个API. 三.Buffer Buffer 是一个类似于数组的 对象,用于表示固定长度的字节序列。Buffer…

Python中字符串和正则表达式

Python中字符串和正则表达式 在Python编程中,字符串是最常用的数据类型之一。字符串用于表示文本数据,而正则表达式则是一种强大的工具,用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…

构造函数与析构函数错题汇总

构造函数不能定义返回类型,也没有返回类型。 堆、栈、静态存储区。栈上的对象main函数结束就释放,堆上的需要手动释放,静态存储区的在所在作用域的程序结束时释放。这里static在main函数内,是局部变量,所以作用域为…

Nginx和Apache有什么异同?

Nginx和Apache都是广泛使用的Web服务器软件,它们各自具有独特的特点和优势,适用于不同的应用场景。以下是关于Nginx和Apache的不同、相同以及使用区别的详细分析: 一、不同点 资源占用与并发处理能力: Nginx使用更少的内存和CPU资…

SQL基础入门——SQL基础语法

1. 数据库、表、列的创建与管理 在SQL中,数据库是一个数据的集合,包含了多个表、视图、索引、存储过程等对象。每个表由若干列(字段)组成,表中的数据行代表记录。管理数据库和表的结构是SQL的基础操作。 1.1 创建数据…

c语言编程1.17蓝桥杯历届试题-回文数字

题目描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求: 该数字的各个数位之…

亚马逊自研大语言模型 Olympus 即将亮相,或将在 LLM 竞赛中掀起新波澜

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

自然语言处理期末试题汇总

建议自己做,写完再来对答案。答案可能存在极小部分错误,不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …

腾讯微众银行大数据面试题(包含数据分析/挖掘方向)面试题及参考答案

为什么喜欢使用 XGBoost,XGBoost 的主要优势有哪些? XGBoost 是一个优化的分布式梯度增强库,在数据科学和机器学习领域应用广泛,深受喜爱,原因主要在于其众多突出优势。 首先,它的精度高,在许多机器学习竞赛和实际应用中,XGBoost 都展现出卓越的预测准确性。其基于决策…

深度学习——激活函数

一、人工神经元 1.1 构建人工神经元 人工神经元接受多个输入信息,对它们进行加权求和,再经过激活函数处理,最后将这个结果输出。 1.2 组成部分 输入(Inputs): 代表输入数据,通常用向量表示,每…

新型大语言模型的预训练与后训练范式,Meta的Llama 3.1语言模型

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

[js] 函数柯里化

面试题:实现一个add方法,使计算结果能够满足如下预期: add(1)(2)(3) 6; add(1, 2, 3)(4) 10; add(1)(2)(3)(4)(5) 15; // 保存不定长参数 let nums []; function add(...args) { // 往数组中插入不定长参数nums.push(...args)// 判断参数…

51单片机从入门到精通:理论与实践指南常用资源篇(六)

很高兴看到大家都坚持下来了,学完了51单片机,接下来两天我会给大家两/三个案例,大家可以看看。 终点并非意味着结束,而是新的开始。这次成功的经验将成为宝贵的财富,激励着我们在未来的人生道路上继续勇往直前。它教会…

git rebase-优雅合并与修改提交

文章目录 简介rebase用于合并使用rebase修改提交cherry-pick 简介 在Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)中我们已经介绍了git的最常用实用的命令。 在上面说的那篇文章中,我们只是简单提了一下rebase。 是因为r…

音视频流媒体直播/点播系统EasyDSS互联网视频云平台介绍

随着互联网技术的飞速发展,音视频流媒体直播已成为现代社会信息传递与娱乐消费的重要组成部分。在这样的背景下,EasyDSS互联网视频云平台应运而生,它以高效、稳定、便捷的特性,为音视频流媒体直播领域带来了全新的解决方案。 1、产…

序列化与反序列化

序列化是将对象转换为可被存储或传输的格式,例如将对象转换为字节流或字符串。序列化的过程可以将对象的状态保存下来,以便在需要时可以重新创建对象。 反序列化则是将序列化的对象转换回原始的对象形式,以便可以使用和操作这些对象。 序列…