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

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

原创
作者头像
数据科学工厂
发布于 2023-02-23 14:39:38
发布于 2023-02-23 14:39:38
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

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

让我们仔细看看。

1. 什么是 asyncio.wait()

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

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

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

2. 如何使用 asyncio.wait()

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

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

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

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

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

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

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

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

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

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

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

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

代码语言:python
代码运行次数: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 来等待第一个任务因异常而失败。

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

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

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

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

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

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

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

3. 等待所有任务的示例

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

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

代码语言:python
代码运行次数: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() 函数来等待一组任务完成。

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

代码语言:python
代码运行次数: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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
Python 知识点记录——高阶函数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
MyJie
2019/11/20
2750
Python学习 Day 5 高阶函数 map/reduce filter sorter 返回函数 匿名函数 装饰器 偏函数
>>> abs(-10) #把abs指向10后,无法通过abs(-10)调用该函数
Ai学习的老章
2019/04/10
3650
Python进阶教程笔记(七)函数式编程
由于参数 x, y 和 f 都可以任意传入,如果 f 传入其他函数,就可以得到不同的返回值。
Lemon黄
2020/10/30
4860
Python进阶教程笔记(七)函数式编程
Python学习笔记(五)——函数式编程
成功!说明变量f现在已经指向了abs函数本身。直接调用abs()函数和调用变量f()完全相同。
蛮三刀酱
2019/09/10
3840
Python闭包
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的:
小破孩的梦想空间
2020/04/23
8030
6 Python 基础: 难点装饰器的学习介绍及实现赌博收益小案例
Python提供了可变参数*args和关键字参数**kwargs,有了这两个参数,装饰器就可以用于任意目标函数了。
野原测试开发
2019/07/24
4640
6 Python 基础: 难点装饰器的学习介绍及实现赌博收益小案例
Day6函数式编程2/3
返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 实现一个可变参数的求和。 def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum 当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数: >>> f = lazy_sum(1, 3, 5, 7,
林清猫耳
2018/04/26
6260
Python(七)
Python 内建了 map() 函数。 map() 函数接收两个参数,一个是函数,一个是 Iterable,map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 Iterator 返回。由于结果是一个 Iterator,Iterator 是惰性序列,因此我们还可以通过 list() 函数让它把整个序列都计算出来并返回一个 list。
1ess
2021/11/01
2680
JavaScript 基础(六) 数组方法 闭包
在一个对象中绑定函数,称为这个对象的方法。 在JavaScript 中,对象的定义是这样的;     var guagua = {         name:'瓜瓜',         birth:1990     };     但是,如果我们给瓜瓜绑定一个函数,就可以做更多的事情。     var guagua = {       name:'瓜瓜',       birth:1990,       age:function(){       var y = new
用户1197315
2018/01/22
8220
Python那些事——Python之函数式编程!
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。函数式编程的一个特点就是,允许函数接收函数作为参数,也允许把函数作为返回值返回。Python对于函数式编程提供部分支持。由于Python允许使用变量,因此Python不是纯函数式编程语言。 #高阶函数 所谓高阶函数,就是允许函数的参数接收其他函数 下面介绍几个python内置的高阶函数: ##map() map()函数接收两个参数,一个序列,
企鹅号小编
2018/02/24
6430
Python那些事——Python之函数式编程!
Python函数式编程-高阶函数、匿名函数、装饰器、偏函数
本篇文章我们来介绍下Python函数式编程的知识。最主要的一点,Python中的函数是对象,可以复制给变量!好了,我们来介绍几个Python函数式编程中的要点,包括高阶函数、匿名函数、装饰器、偏函数等等。精彩内容,不容错过!
QQ1622479435
2018/10/23
7660
Python 基础 高阶函数
python 把函数作为参数   如果传入abs 作为参数     def add(x,y,y):       return f(x) + f(y)     add(-5,9,abs)   根据函数的定义,函数执行的代码实际上是。     abs(-5) + abs(9) python 中map() 函数     map() 是 python 内置的高阶函数,它接收一个函数 f 和 一个list,并且把 f 一次作用在     list的每一个元素上,得到一个新的list 并返回。     我们需要传入函数
用户1197315
2018/04/03
7170
一篇文章带你搞定Python返回函数
比如上面例子的re函数闭包的特性,嵌套定义在非全局作用域里面的函数,能够记住它在被定义的时候它所处的封闭命名空间。
Go进阶者
2021/03/24
2880
一篇文章带你搞定Python返回函数
Python学习笔记(四)·函数式编程
函数是 Python 内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
公爵
2022/09/28
9520
Python学习笔记(四)·函数式编程
Python3 函数式编程
高阶函数(Higher-order function),由于在 Python 中,变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接受另一个函数作为参数。接收其他函数作为参数的函数称之为高阶函数。一个简单例子如下:
嵌入式视觉
2022/09/05
3400
Python3 函数式编程
Python的闭包(Closure)与惰性计算(Lazy Evaluation)
闭包 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的 函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中的变量的引用。其中所引用的变量称作上值(upvalue)。 https://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6) 事实上,你可能在JavaScript那
Steve Wang
2018/02/05
1.5K0
自学Python二 Python中的屠龙刀(续)
秉承着一切皆对象的理念,函数作为对象,可以为其赋值新的对象名,也可以作为参数传递给其他函数!
叁金
2018/09/04
3870
老男孩Python全栈开发(92天全)视频教程 自学笔记15
day15课程内容:   高阶函数   1、函数名可以进行赋值   2、函数名可以作为参数,也可以作为函数的返回值 def f(): print("高阶函数") def bar(a,b,c): c() print("高阶函数%s%s"%(a,b)) bar(1,1,f) # 高阶函数 # 高阶函数11 ############### def f1(n): print("高阶函数调用%s"%n) return n*n def bar1(a,b,c): d=c(a
玩蛇的胖纸
2018/06/08
6050
Python 函数式编程和面向对象编程
接收abs函数,定义一个函数,接收x,y,z三个参数。其中x,y是数值,z是函数 。
周小董
2019/03/25
1.1K0
Python 函数式编程和面向对象编程
Python函数式编程:返回函数与匿名函数
接着上次的Python函数式编程,小编继续往下学习了函数式编程的剩下的一些内容。今天的内容包括返回函数和匿名函数。顺便说一句,Python真的比R难学啊,对于没有计算机学科基础的同学来说,自学Python确实挺头疼的。
小白学视觉
2022/09/28
7630
相关推荐
Python 知识点记录——高阶函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档