Python 异步等待任务集合
作者:冷冻工厂 发布时间:2022-08-14 17:23:22
我们可以通过 asyncio.wait() 函数等待异步任务完成。可以等待不同的条件,例如所有任务完成、第一个任务完成以及第一个任务因异常而失败。
让我们仔细看看。
1. 什么是 asyncio.wait()
asyncio.wait() 函数可用于等待一组异步任务完成。回想一下,asyncio 任务是包装协程的 asyncio.Task 类的一个实例。它允许独立调度和执行协程,Task 实例提供任务句柄以查询状态和获取结果。
wait() 函数允许我们等待一组任务完成。等待调用可以配置为等待不同的条件,例如所有任务完成、第一个任务完成以及第一个任务因错误而失败。
接下来,让我们看看如何使用 wait() 函数。
2. 如何使用 asyncio.wait()
asyncio.wait() 函数采用可等待对象的集合,通常是 Task 对象。
这可以是我们创建的列表、字典或任务对象集,例如通过在列表理解中调用 asyncio.create_task() 函数。
...
# create many tasks
tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]
asyncio.wait() 在满足任务集合的某些条件之前不会返回。默认情况下,条件是所有任务都已完成。
wait() 函数返回两个集合的元组。第一个集合包含所有满足条件的任务对象,第二个集合包含所有其他尚未满足条件的任务对象。
这些集被称为“完成”集和“待定”集。
...
# wait for all tasks to complete
done, pending = await asyncio.wait(tasks)
从技术上讲,asyncio.wait() 是一个返回协程的协程函数。然后我们可以等待这个协程,它将返回集合的元组。
...
# create the wait coroutine
wait_coro = asyncio.wait(tasks)
# await the wait coroutine
tuple = await wait_coro
等待的条件可以由默认设置为 asyncio.ALL_COMPLETED 的“return_when”参数指定。
...
# wait for all tasks to complete
done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)
我们可以通过将 return_when 设置为 FIRST_COMPLETED 来等待第一个任务完成
...
# wait for the first task to be completed
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
当第一个任务完成并在完成集中返回时,其余任务不会被取消并继续并发执行。
我们可以通过将 return_when 设置为 FIRST_EXCEPTION 来等待第一个任务因异常而失败。
...
# wait for the first task to fail
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)
在这种情况下,完成集将包含第一个因异常而失败的任务。如果没有任务因异常而失败,则完成集将包含所有任务,只有在所有任务完成后 wait() 才会返回。
我们可以通过以秒为单位的“超时”参数指定我们愿意等待给定条件的时间。
如果在满足条件之前超时到期,则返回任务元组以及当时满足条件的任何任务子集,例如如果等待所有任务完成,则完成的任务子集。
...
# wait for all tasks to complete with a timeout
done, pending = await asyncio.wait(tasks, timeout=3)
如果在满足条件之前达到超时,则不会引发异常并且不会取消剩余任务。
现在我们知道如何使用 asyncio.wait() 函数,让我们看一些有效的例子。
3. 等待所有任务的示例
我们可以探索如何使用 asyncio.wait() 等待所有任务。在这个例子中,我们将定义一个简单的任务协程,它生成一个随机值,休眠几分之一秒,然后用生成的值报告一条消息。
然后,主协程将与协程一起在列表理解中创建许多任务,然后等待所有任务完成。
# 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() 函数来等待一组任务完成。
这可能是该函数最常见的用法。请注意,由于使用了随机数,每次运行程序时结果都会不同。
>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
来源:https://juejin.cn/post/7203336895886409788


猜你喜欢
- 困扰我很久问题终于在昨天被解决了。其实问题很简单<% =now %>老是显示12小时制,总是出现上午、下午。这个问题虽然很小,但
- 一、函数基础简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。Python中的函数在其他语言中也叫做过程
- 给定损失函数的输入y,pred,shape均为bxc。若设定loss_fn = torch.nn.MSELoss(reduction=
- RESTful API在Web项目开发中广泛使用,本文针对Go语言如何一步步实现RESTful JSON API进行讲解, 另外也会涉及到R
- 前言加密解密在实际开发中应用比较广泛,常用加解密分为:“对称式”、“非对称式&a
- 简介ICO是一种图标文件格式,图标文件可以存储单个图案、多尺寸、多色板的图标文件。一个图标实际上是多张不同格式的图片的集合体,并且还包含了一
- 前言在上一篇文中,我们介绍了关于Python正则表达式的基础,那么在这一篇文章里,我们将总结一下正则表达式关于捕获的用法。下面话不多说,来看
- 我们目前已经学会了四个控件,也编出了几个窗口实例,它们都有一个共同的特点,就是丑,主要原因是没有进行合理地布局。此前的布局方式简单粗暴,即明
- DJANGO-ALLAUTH是github上面排名较高的django user系统.本来通过对比是想选用django-userea的,可是博
- 前言之前做了一个校园交友的APP,其中一个逻辑是通过用户的教务系统来确认用户是一名在校大学生,基本的想法是通过用户的账号和密码,用爬虫的方法
- 查询速度慢的原因很多,常见如下几种:1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2.I/O吞吐量小,形成了瓶颈效
- 1. 信号与槽(Signals and slots)信号与槽机制是 PyQt 的核心机制,用于对象之间的通信,也就是实现函数之间的自动调用。
- 项目初始化首先我们创建一个目录,初始化 npm,得到一个package.json文件。mkdir react-clicd react-cli
- PDO常用方法:PDO::query()主要用于有记录结果返回的操作(PDOStatement),特别是select操作。PDO::exec
- 为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用的文件对象占用内存。举个例子,对文本文件
- Pytorch中的model.train() 和 model.eval() 原理与用法一、两种模式pytorch可以给我们提供两种方式来切换
- 本文实例讲述了Python实现的数据结构与算法之基本搜索。分享给大家供大家参考。具体分析如下:一、顺序搜索顺序搜索 是最简单直观的搜索方法:
- 在这可以用join()函数'x'.join(y),x可以是任意分割字符,y是列表或元组。以列表为例,可以将列表中的每一个元素
- 简单邮件传输协议(SMTP)是一种协议,用于处理在电子邮件服务器之间发送电子邮件和路由电子邮件。Python提供了smtplib模块,该模块
- 用法:分析一个脚本的依赖: analysis_dependency.py script1.py递归分析依赖: analysis_depend