位置: IT常识 - 正文

深究Python中的asyncio库-shield函数

编辑:rootadmin

推荐整理分享深究Python中的asyncio库-shield函数,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

shield

asyncio.shield,用它可以屏蔽取消操作。一直到这里,我们还没有见识过Task的取消。

看一个例子:

In:loop=asyncio.get_event_loop()In:task1=loop.create_task(a())In:task2=loop.create_task(b())In:task1.cancel()Out:TrueIn:awaitasyncio.gather(task1,task2)SuspendingaSuspendingb---------------------------------------------------------------------------CancelledErrorTraceback(mostrecentcalllast)cell_nameinasync-def-wrapper()CancelledError:

在上面的例子中,task1被取消了后再用asyncio.gather收集结果,直接抛CancelledError错误了。这里有个细节,gather支持return_exceptions参数:

In:awaitasyncio.gather(task1,task2,return_exceptions=True)Out:[concurrent.futures._base.CancelledError(),'B']

可以看到,task2依然会执行完成,但是task1的返回值是一个CancelledError错误,也就是任务被取消了。如果一个创建后就不希望被任何情况取消,可以使用asyncio.shield保护任务能顺利完成。不过要注意一个陷阱,先看错误的写法:

In:task1=asyncio.shield(a())In:task2=loop.create_task(b())In:task1.cancel()Out:TrueIn:awaitasyncio.gather(task1,task2,return_exceptions=True)SuspendingaSuspendingbResumingbOut:[concurrent.futures._base.CancelledError(),'B']深究Python中的asyncio库-shield函数

可以看到依然是CancelledError错误,且协程a未执行完成,正确的用法是这样的:

In:task1=asyncio.shield(a())In:task2=loop.create_task(b())In:ts=asyncio.gather(task1,task2,return_exceptions=True)In:task1.cancel()Out:TrueIn:awaittsSuspendingaSuspendingbResumingaResumingbOut:[concurrent.futures._base.CancelledError(),'B']

可以看到虽然结果是一个CancelledError错误,但是看输出能确认协程实际上是执行了的。所以正确步骤是:

先创建 GatheringFuture 对象 ts

取消任务

await ts

asynccontextmanager

如果你了解Python,之前可能听过或者用过contextmanager ,一个上下文管理器。通过一个计时的例子就理解它的作用:

fromcontextlibimportcontextmanagerasyncdefa():awaitasyncio.sleep(3)return'A'asyncdefb():awaitasyncio.sleep(1)return'B'asyncdefs1():returnawaitasyncio.gather(a(),b())@contextmanagerdeftimed(func):start=time.perf_counter()yieldasyncio.run(func())print(f'Cost:{time.perf_counter()-start}')

timed函数用了contextmanager装饰器,把协程的运行结果yield出来,执行结束后还计算了耗时:

In:fromcontextmanagerimport*In:withtimed(s1)asrv:...:print(f'Result:{rv}')...:Result:['A','B']Cost:3.0052654459999992

大家先体会一下。在Python 3.7添加了asynccontextmanager,也就是异步版本的contextmanager,适合异步函数的执行,上例可以这么改:

@asynccontextmanagerasyncdefasync_timed(func):start=time.perf_counter()yieldawaitfunc()print(f'Cost:{time.perf_counter()-start}')asyncdefmain():asyncwithasync_timed(s1)asrv:print(f'Result:{rv}')In:asyncio.run(main())Result:['A','B']Cost:3.00414147500004

async版本的with要用async with,另外要注意yield await func()这句,相当于yield + await func()

PS: contextmanager 和 asynccontextmanager 最好的理解方法是去看源码注释

本文链接地址:https://www.jiuchutong.com/zhishi/304160.html 转载请保留说明!

上一篇:phpcms如何生成静态(phpcms怎么用)

下一篇:帝国cms图片显示不出来如何解决(帝国cms图片显示不了)

  • 想要把产品、营销做好,必须要懂人性(如何把一个产品做起来)

    想要把产品、营销做好,必须要懂人性(如何把一个产品做起来)

  • 苹果支付扣款在哪里(苹果支付扣款在哪里看记录)

    苹果支付扣款在哪里(苹果支付扣款在哪里看记录)

  • 小米照片左下角水印如何去除(小米照片左下角的手机标志怎么去掉)

    小米照片左下角水印如何去除(小米照片左下角的手机标志怎么去掉)

  • iphone11与pro的区别(iphone11和pro的区别知乎)

    iphone11与pro的区别(iphone11和pro的区别知乎)

  • 叨叨记账发不出去消息怎么回事(叨叨记账为什么没有导出账单)

    叨叨记账发不出去消息怎么回事(叨叨记账为什么没有导出账单)

  • 芒果tv7天会员怎么激活(芒果tv7天会员怎么领)

    芒果tv7天会员怎么激活(芒果tv7天会员怎么领)

  • 抖音怎么看别人什么时候登录(抖音怎么看别人收藏了自己的作品)

    抖音怎么看别人什么时候登录(抖音怎么看别人收藏了自己的作品)

  • 银河奇异果卡顿解决方法(银河奇异果很卡)

    银河奇异果卡顿解决方法(银河奇异果很卡)

  • 苹果手机怎么连拍十张(苹果手机怎么连接空调)

    苹果手机怎么连拍十张(苹果手机怎么连接空调)

  • 笔记本键盘关机快捷键是什么(笔记本键盘关机电脑按哪个键)

    笔记本键盘关机快捷键是什么(笔记本键盘关机电脑按哪个键)

  • 文档和文件夹一样吗(文档和文件夹一起发送)

    文档和文件夹一样吗(文档和文件夹一起发送)

  • 华为matebook14键盘灯怎么打开(华为matebook14键盘锁了)

    华为matebook14键盘灯怎么打开(华为matebook14键盘锁了)

  • oppor9s死机了按什么都没用怎么办(oppor9sk死机后无法重启)

    oppor9s死机了按什么都没用怎么办(oppor9sk死机后无法重启)

  • 手机进水一直重启怎么办(手机进水一直重启循环开不了机)

    手机进水一直重启怎么办(手机进水一直重启循环开不了机)

  • 苹果11掉电快怎么办(苹果11掉电快怎么回事)

    苹果11掉电快怎么办(苹果11掉电快怎么回事)

  • 什么网盘可以免费上传视频(什么网盘可以免费倍速)

    什么网盘可以免费上传视频(什么网盘可以免费倍速)

  • 快手发私信频繁怎么办(快手发私信频繁要过多长时间)

    快手发私信频繁怎么办(快手发私信频繁要过多长时间)

  • word有画笔功能吗(word画笔功能为啥用不了)

    word有画笔功能吗(word画笔功能为啥用不了)

  • m和g哪个大流量(m与g流量对比)

    m和g哪个大流量(m与g流量对比)

  • 苹果x边框划痕怎样修复(苹果边框划痕怎么修复)

    苹果x边框划痕怎样修复(苹果边框划痕怎么修复)

  • 机箱自带的sata线接哪里(机箱自带的sata线接哪里啊)

    机箱自带的sata线接哪里(机箱自带的sata线接哪里啊)

  • ip设置dhcp和静态是什么意思(dhcp 静态ip pppoe怎么选择)

    ip设置dhcp和静态是什么意思(dhcp 静态ip pppoe怎么选择)

  • 三星录屏功能在哪呢(三星录屏在哪)

    三星录屏功能在哪呢(三星录屏在哪)

  • 打印机图标上有问号(打印机图标上有两个人)

    打印机图标上有问号(打印机图标上有两个人)

  • hd camera是什么品牌(hdcamera是什么品牌摄像头图片)

    hd camera是什么品牌(hdcamera是什么品牌摄像头图片)

  • 在vue3+vite项目下按需引入vant报错Failed to resolve import解决方案(vue3 provide inject)

    在vue3+vite项目下按需引入vant报错Failed to resolve import解决方案(vue3 provide inject)

  • Vue3+TypeScript+Vite如何使用require动态引入类似于图片等静态资源

    Vue3+TypeScript+Vite如何使用require动态引入类似于图片等静态资源

  • VSCode开发:使用nvm切换node版本(vscode开发gui)

    VSCode开发:使用nvm切换node版本(vscode开发gui)

  • 税控盘没有清卡,反写怎么办
  • 短期借款的实际资金成本
  • 普票为啥不能抵扣
  • 银行端查询缴税凭证怎么盖章
  • 季度所得税申报表营业收入怎么填
  • 固定收益款可以开增值税专票吗?
  • 企业注销当月无法申报个税
  • 开发间接费什么时候计提
  • 不征税收入的所得税处理
  • 营改增土地出租
  • 大家怎么看恒大品牌
  • 有支出没有发票应怎么整改
  • 房产税申报后多久缴纳税款
  • 税局税种认定
  • 个人所得税中薪资与实际工资有什么差别
  • 节能减排奖励资金追回
  • 财务费用算营业利润吗
  • 坏账准备为负数怎么填资产负债表
  • 预付加油卡发票可以报销吗
  • 甲方代付农民工工资合同
  • reminder.exe - reminder是什么进程 有什么用
  • 电脑运行慢怎么清理c盘
  • 微软2003系统
  • 收到发票未抵扣谁开红字
  • chormedriver安装
  • 土地增值税的计算方法和步骤例题
  • 应收账款如何做会计分录
  • 实际缴纳消费税计算公式
  • 应付职工薪酬资产还是负债
  • phpwechat
  • 增值税留抵税额可以结转下一年吗
  • 职工伙食费会计科目
  • 帝国cms如何使用
  • 企业会计准则季报利润表填写
  • 增值税普通发票可以抵扣吗
  • 农民工的劳务报酬个人所得税怎么那么高
  • php数据库网址
  • wordpress站点地址如何设置
  • 启动mysql的语句
  • 有材料成本差异率怎么算材料成本差异
  • 记账凭证装订好了如何在拆开
  • 执行企业会计制度是什么意思
  • 纳税调整调减有哪些
  • 开发无形资产过程中发生的支出计入什么科目
  • 委托加工物资账务
  • 非居民企业的所得一律适用20%的企业所得税税率
  • 企业减少注册资本
  • 小规模纳税人免税会计分录
  • 国债逆回购收益什么时候到账
  • 残保金季报还是月报
  • 软件企业的研发费用占比
  • 以前年度损益调整在利润表中怎么填
  • 房地产企业所得税税负率是多少
  • 人力公司开的代驾发票
  • 应付票据含税吗
  • mysql 复合查询
  • w10的产品密钥
  • win10右键菜单怎么设置
  • linux命令关机命令
  • kmservice.exe是什么
  • emule.td文件怎么打开
  • qqpcrtp.exe是什么进程 如何删除qqpcrtp进程
  • win7专业版系统镜像
  • unity自带的代码编辑器
  • jQuery中ajax错误调试分析
  • jquery keydown
  • node.js怎么用
  • 批处理打开网络连接
  • javascript怎么写
  • jQuery使用getJSON方法获取json数据完整示例
  • unity 设置物体角度
  • python的了解
  • 税法 农产品增值税题目及答案
  • 如何安装金税三期app
  • 如何填写财产申报表
  • 公积金提取需要几个工作日
  • 中华人民共和国刑法
  • 德阳契税收费标准2022
  • 税收优惠政策能调动公众的捐赠积极性
  • 增值税专用发票和普通发票的区别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设