首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

并发编程 协程加强篇2

新语法的说明

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新用

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190109G1HIGK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券