新语法的说明
1.概念
2.语法
3.状态
4.时序图
3.5.4.回调函数(新用法)
3.5.5.异常相关扩展
3.5.6.任务分组、取消
1.分组
2.取消
wait_for and wait
1.一个任务限时等待(wait_for)
2.多个任务限时等待(wait)
wait的扩展
第一个任务执行完成则结束此批次任务
官方原话是这样的:
大概意思就是:loop参数会在3.10给干掉,而不是 方法被干掉
新语法的说明
1.概念
先说说概念:
事件循环:
程序开启一个无限的循环,程序员会把一些函数(协程)注册到事件循环上
当满足事件发生的时候,调用相应的协程函数
协程:
协程对象,指一个使用 关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象
协程对象需要注册到事件循环,由事件循环调用
对象:
代表将来执行或没有执行的任务的结果(它和task上没有本质的区别)
任务:
一个协程对象就是一个原生可以挂起的函数,Task则是对协程进一步封装,其中包含任务的各种状态
对象是 的子类,它将 和 联系在一起,将 封装成一个 对象
关键字:
定义协程的关键字, 定义一个协程, 用于挂起阻塞的异步调用接口
类似于 (都是在调用方与子协程之间直接建立一个双向通道)
2.语法
为了避免读者混乱于新旧代码的使用,从下面开始就直接使用最新的语法的
运行asyncio:
只运行一次( )
创建一个任务:
Python3.8会多一个name的别名参数
批量执行任务:
return_exceptions=True可以屏蔽这批任务的异常,并把异常结果返回
如果有类似于(第一个任务完成|第一个异常产生后)进行相应的操作,则推荐
获取loop:
优先考虑: (获取不到会抛异常)
3.状态
Task基本上就是这几个状态(生成器、Future也是):
:创建Task,还未执行
:事件循环正在调用执行任务
:Task执行完毕
:Task被取消后的状态
4.时序图
Python3.7之前官方贴了张时序图,我们拿来理解上面的话:
3.5.4.回调函数(新用法)
和旧版本比起来其实就是创建一个 ,然后为 添加一个回调函数
输出:
注意: 是loop独有的方法,Task中没有,eg:
3.5.5.异常相关扩展
关于批量任务的异常处理:
默认:同一批次有一个task产生了异常,这一批次任务就全部结束了
:不影响其他任务,异常消息也放在结果列表中
当 被取消的时候,不管True or False,这批次任务全部取消
输出:
3.5.6.任务分组、取消
1.分组
看个简单的任务分组案例:
输出:(两个分组结果被一起放到了list中)
2.取消
如果想要对 和 进行更多的自定化,可以再包裹一层 方法:
输出:
再看个单个任务的案例:
输出:
简单说明下:
:任务是否完成
任务完成: :
任务正常完成
触发异常而被标记为任务完成
:用来判断是否成功取消
为什么这么说?看看源码:
PS:官方推荐(loop中尚未完成的Task集合):
原来是通过: 来获取(返回loop的所有Task集合)
wait_for and wait
1.一个任务限时等待(wait_for)
超时等待:
输出:
2.多个任务限时等待(wait)
是比 更底层的api,比如现在这个多任务限时等待并不能满足:
输出:
wait的扩展
用法其实和Future一样(
https://www.cnblogs.com/dotnetcrazy/p/9528315.html#Future对象
),这边就当再普及下新语法了
第一个任务执行完成则结束此批次任务
项目里经常有这么一个场景: ,看个引入案例
输出:
下级预估:旧代码兼容、同步语、Socket新用
领取专属 10元无门槛券
私享最新 技术干货