前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 异步: 等待任务集合(11)

Python 异步: 等待任务集合(11)

作者头像
数据科学工厂
发布于 2023-02-27 05:23:39
发布于 2023-02-27 05:23:39
1K00
代码可运行
举报
运行总次数:0
代码可运行

我们可以通过 asyncio.wait() 函数等待异步任务完成。可以等待不同的条件,例如所有任务完成、第一个任务完成以及第一个任务因异常而失败。

让我们仔细看看。

1. 什么是 asyncio.wait()

asyncio.wait() 函数可用于等待一组异步任务完成。回想一下,asyncio 任务是包装协程的 asyncio.Task 类的一个实例。它允许独立调度和执行协程,Task 实例提供任务句柄以查询状态和获取结果。

wait() 函数允许我们等待一组任务完成。等待调用可以配置为等待不同的条件,例如所有任务完成、第一个任务完成以及第一个任务因错误而失败。

接下来,让我们看看如何使用 wait() 函数。

2. 如何使用 asyncio.wait()

asyncio.wait() 函数采用可等待对象的集合,通常是 Task 对象。

这可以是我们创建的列表、字典或任务对象集,例如通过在列表理解中调用 asyncio.create_task() 函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
# create many tasks
tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]

asyncio.wait() 在满足任务集合的某些条件之前不会返回。默认情况下,条件是所有任务都已完成。

wait() 函数返回两个集合的元组。第一个集合包含所有满足条件的任务对象,第二个集合包含所有其他尚未满足条件的任务对象。

这些集被称为“完成”集和“待定”集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
# wait for all tasks to complete
done, pending = await asyncio.wait(tasks)

从技术上讲,asyncio.wait() 是一个返回协程的协程函数。然后我们可以等待这个协程,它将返回集合的元组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
# create the wait coroutine
wait_coro = asyncio.wait(tasks)
# await the wait coroutine
tuple = await wait_coro

等待的条件可以由默认设置为 asyncio.ALL_COMPLETED 的“return_when”参数指定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
# wait for all tasks to complete
done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)

我们可以通过将 return_when 设置为 FIRST_COMPLETED 来等待第一个任务完成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
# wait for the first task to be completed
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)

当第一个任务完成并在完成集中返回时,其余任务不会被取消并继续并发执行。

我们可以通过将 return_when 设置为 FIRST_EXCEPTION 来等待第一个任务因异常而失败。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
# wait for the first task to fail
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)

在这种情况下,完成集将包含第一个因异常而失败的任务。如果没有任务因异常而失败,则完成集将包含所有任务,只有在所有任务完成后 wait() 才会返回。

我们可以通过以秒为单位的“超时”参数指定我们愿意等待给定条件的时间。

如果在满足条件之前超时到期,则返回任务元组以及当时满足条件的任何任务子集,例如如果等待所有任务完成,则完成的任务子集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
# wait for all tasks to complete with a timeout
done, pending = await asyncio.wait(tasks, timeout=3)

如果在满足条件之前达到超时,则不会引发异常并且不会取消剩余任务。

现在我们知道如何使用 asyncio.wait() 函数,让我们看一些有效的例子。

3. 等待所有任务的示例

我们可以探索如何使用 asyncio.wait() 等待所有任务。在这个例子中,我们将定义一个简单的任务协程,它生成一个随机值,休眠几分之一秒,然后用生成的值报告一条消息。

然后,主协程将与协程一起在列表理解中创建许多任务,然后等待所有任务完成。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# SuperFastPython.com
# example of waiting for all tasks to complete
from random import random
import asyncio
 
# coroutine to execute in a new task
async def task_coro(arg):
    # generate a random value between 0 and 1
    value = random()
    # block for a moment
    await asyncio.sleep(value)
    # report the value
    print(f'>task {arg} done with {value}')
 
# main coroutine
async def main():
    # create many tasks
    tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]
    # wait for all tasks to complete
    done,pending = await asyncio.wait(tasks)
    # report results
    print('All done')
 
# start the asyncio program
asyncio.run(main())

运行示例首先创建 main() 协程并将其用作 asyncio 程序的入口点。

然后 main() 协程在列表理解中创建一个包含十个任务的列表,每个任务提供一个从 0 到 9 的唯一整数参数。

然后 main() 协程被挂起并等待所有任务完成。任务执行。每个生成一个随机值,休眠片刻,然后报告其生成的值。

所有任务完成后,main() 协程恢复并报告最终消息。这个例子强调了我们如何使用 wait() 函数来等待一组任务完成。

这可能是该函数最常见的用法。请注意,由于使用了随机数,每次运行程序时结果都会不同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>task 5 done with 0.0591009105682192
>task 8 done with 0.10453715687017351
>task 0 done with 0.15462838864295925
>task 6 done with 0.4103492027393125
>task 9 done with 0.45567100006991623
>task 2 done with 0.6984682905809402
>task 7 done with 0.7785363531316224
>task 3 done with 0.827386088873161
>task 4 done with 0.9481344994700972
>task 1 done with 0.9577302665040541
All done


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冷冻工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊httpclient的connect
org/apache/http/conn/HttpClientConnectionOperator.java
code4it
2023/11/27
1460
聊聊httpclient的connect
聊聊httpclient的connect
org/apache/http/conn/HttpClientConnectionOperator.java
code4it
2023/11/26
3880
容器网络实践
本文通过docker的网络介绍容器网络的原理以及一些实践,通过实践一遍相信大家会对网络底层的原理有个更深的理解,最后给出对接ovs的教程,这对下一篇k8s对接ovn的原理理解打下一个基础。
sealyun
2019/07/25
7490
聊聊HttpClient的DnsResolver
org/apache/http/impl/conn/InMemoryDnsResolver.java
code4it
2023/10/17
4070
036.集群网络-K8S网络模型及Linux基础网络
  Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则的原因是,用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑如何将容器端口映射到主机端口等问题。
不会飞的小鸟
2020/03/22
7620
java protostuff 序列化_使用Protostuff序列化
rpc调用,有多种序列化的方式,通用如json,mongodb使用的bson;java方面的,比如Java默认的序列化,比如hessian;还有跨语言的,比如thrift、protocolbuf。thrift和pb的好处是序列化后size比较小,但是缺点是得生成java代码,这个挺鸡肋的,所以不管二者运行时效率有多高,开发效率相对比较低的。像hessian,是有一些在用,但是感觉不如pb那样强大。所以也一直在寻找运行效率与开发效率兼得的序列化方式。偶尔在网上看到protostuff,觉得找到了一直在找的这种序列化方式。
全栈程序员站长
2022/08/22
1.2K0
java protostuff 序列化_使用Protostuff序列化
Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型
本文转载自:htJava网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型
Java技术江湖
2019/11/21
6910
网络|Netty|异步|接口
Channel它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执 行一个或者多个不同的I/O操作的程序组件)的开放连接,如读操作和写操作 .
heidsoft
2022/08/31
4860
浅谈容器网络
容器技术通过轻量化的资源隔离机制,极大地简化了应用部署的复杂性。而容器网络作为容器生态的核心组件,直接影响着容器间通信、服务发现及跨主机协同的能力。本文将从容器网络的基础组件出发,逐步剖析其工作原理及关键实现。
rxg456
2025/04/01
960
浅谈容器网络
ES系列(二):基于多播的集群发现实现原理解析
ES作为超强悍的搜索引擎,除了需要具有齐全的功能支持,超高的性能,还必须要有任意扩展的能力。一定程度上,它是一个大数据产品。而要做扩展性,集群自然少不了。然而单独的集群又是不够的,能够做的事情太少(比如通常的集群为负载均衡式对等集群),所以它需要自己组建合适自己的集群。也就是服务需要自动发现,自动协调集群实例。当然,这只是扩展性的第一步。
烂猪皮
2021/05/11
1K0
云原生时代必须具备的核心技能之Docker高级篇(Docker网络详解)
  前面给大家项目的介绍了Docker的基础内容 Docker基础篇 接下来给大家系统的介绍下Docker高级篇的内容:网络核心、Docker实战、DockerCompose、Harbor以及Swarm。欢迎关注收藏哦
用户4919348
2022/01/06
6990
云原生时代必须具备的核心技能之Docker高级篇(Docker网络详解)
推荐一款轻量级 HTTP/HTTPS 代理 TinyProxy
众所周知,我们常用的 Nginx / Apache 都可以很方便的用来做为正向或反向代理服务器使用。但是它们都并不支持 HTTPS 的正向代理。
iMike
2019/07/30
56.5K3
云原生虚拟网络 tun/tap & veth-pair
以前在研究 k8s 网络的时候,很多东西都看不太懂,只是蜻蜓点水过一下,这段时间打算恶补一下虚拟网络方面的知识,感兴趣的不妨一起探讨学习一下。
luozhiyun
2022/10/04
2K0
云原生虚拟网络 tun/tap & veth-pair
用iperf这个小工具,进行网络测试变得简单多了,就问你city不city?
在真正的项目中,网络质量是整个项目成功与否的基础。不但我们平时能想到基础物理设备间的网速、延迟和丢包数值都需要符合标准,在我经常接触的公有云中,不同的云主机的网络性能也需符合标准。但有时会遇到没有现成测试工具的情况,那我这时就用iperf做测试。今天我们就介绍iperf工具,它免费、轻量、操作简单,还可以做双向测试!
ICT系统集成阿祥
2024/12/03
9780
用iperf这个小工具,进行网络测试变得简单多了,就问你city不city?
Docker-进阶(容器网络、compose、harbor、swarm)
接着Docker-入门,上次了解了Docker的基本命令,镜像容器操作,自定义镜像两种方式(容器和DockerFile),数据卷实现容器数据持久化和容器间数据共享,都是日常工作中最常用的。
aruba
2022/09/28
9350
Docker-进阶(容器网络、compose、harbor、swarm)
介绍一个监控网卡及网络流量的好工具NICSTAT
最近发现了个好的工具,是监控网卡及网络流量的叫NICSTAT,这里我通过这个例子来说明
三杯水Plus
2018/11/14
2K0
聊聊nacos server的PushService
nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/push/PushService.java
code4it
2019/10/16
6260
axis和cxf集成Springmvc的使用
新建工程--》选择wsdl文件--》右键选择Webservice--->Generate Java Bean Skeleton
JQ实验室
2022/02/09
1K0
axis和cxf集成Springmvc的使用
JAVA--网络编程
(3)动态和/或私有端口(Dyanmic and /or Private Ports)
宁在春
2022/10/31
1960
JAVA--网络编程
KubeVirt macvtap虚拟机创建过程 自动实验
继续上篇 https://www.backendcloud.cn/2022/06/06/macvtap-lab/ 上篇是纯手动,这篇是借助Kubernetes+KubeVirt自动。
后端云
2022/11/25
2K0
KubeVirt macvtap虚拟机创建过程 自动实验
相关推荐
聊聊httpclient的connect
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验