位置: 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图片显示不了)

  • 多多买菜怎么退款(多多买菜怎么退出申请)

    多多买菜怎么退款(多多买菜怎么退出申请)

  • 手机qq咋设置自动回复(手机qq怎么设置自动)

    手机qq咋设置自动回复(手机qq怎么设置自动)

  • 微信置顶聊天怎么设置(微信置顶聊天怎么折叠不了)

    微信置顶聊天怎么设置(微信置顶聊天怎么折叠不了)

  • hd啥意思在手机里(手机hd何意)

    hd啥意思在手机里(手机hd何意)

  • 微信收付款二维码怎么弄(微信收付款二维码怎么开通)

    微信收付款二维码怎么弄(微信收付款二维码怎么开通)

  • 电脑桌面软件图标显示白色但是能打开(电脑桌面软件图标怎么换样子)

    电脑桌面软件图标显示白色但是能打开(电脑桌面软件图标怎么换样子)

  • 三卡三待智能手机有哪些(三卡三待智能手机2023)

    三卡三待智能手机有哪些(三卡三待智能手机2023)

  • 安卓ios在哪里打开(安卓怎么打苹果符号)

    安卓ios在哪里打开(安卓怎么打苹果符号)

  • 咸鱼买手机被骗了怎么办(咸鱼买手机被骗了如何怎么办)

    咸鱼买手机被骗了怎么办(咸鱼买手机被骗了如何怎么办)

  • 视频怎么分享到朋友圈里面(视频怎么分享到QQ)

    视频怎么分享到朋友圈里面(视频怎么分享到QQ)

  • 抖音号是自己设置的吗(抖音号不能自己设置吗)

    抖音号是自己设置的吗(抖音号不能自己设置吗)

  • 苹果xs几个卡(苹果12pro max是单卡还是双卡)

    苹果xs几个卡(苹果12pro max是单卡还是双卡)

  • 设置特别关心有什么用(设置特别关心会怎么样)

    设置特别关心有什么用(设置特别关心会怎么样)

  • 快手集福在哪(快手集福在哪里开奖)

    快手集福在哪(快手集福在哪里开奖)

  • 电脑wps表格怎么发送(电脑wps表格怎么调整表格大小)

    电脑wps表格怎么发送(电脑wps表格怎么调整表格大小)

  • 苹果6s能不能升级ios13(苹果6s能不能升级15.7.5)

    苹果6s能不能升级ios13(苹果6s能不能升级15.7.5)

  • 苹果电脑如何打开exe文件(苹果电脑如何打开u盘文件)

    苹果电脑如何打开exe文件(苹果电脑如何打开u盘文件)

  • 红外幕帘探测器干嘛用的(红外幕帘探测器能录像吗)

    红外幕帘探测器干嘛用的(红外幕帘探测器能录像吗)

  • 手机wps查找功能在哪里(手机wps查找功能变灰色)

    手机wps查找功能在哪里(手机wps查找功能变灰色)

  • 小米手环4不能关机吗(小米手环4不能控制音乐)

    小米手环4不能关机吗(小米手环4不能控制音乐)

  • 苹果退出id照片还在吗(苹果退出id照片还会同步吗)

    苹果退出id照片还在吗(苹果退出id照片还会同步吗)

  • 分析微博营销的有哪些误区(分析微博营销的方法)

    分析微博营销的有哪些误区(分析微博营销的方法)

  • 电脑图片格式怎么转换(电脑图片格式怎么转换成pdf格式)

    电脑图片格式怎么转换(电脑图片格式怎么转换成pdf格式)

  • 幂等性是什么?(java幂等性是什么)

    幂等性是什么?(java幂等性是什么)

  • 委托贷款利息收入需要缴纳增值税么
  • 一般计税方法适用于500万
  • 进项税跟增值税
  • 购进灭火器材怎么入账
  • 讲师讲课费标准2019
  • 员工出差的餐补计入什么科目
  • 农户的竹扫把如何开票
  • 转账支票存根联图片
  • 出让固定资产怎样计算增值税
  • 原材料作废品处理方法
  • 事业单位取暖费标准
  • 劳务公司购买设备怎么做账
  • 由财政拨钱还银行借款怎么做分录?
  • 因产品不合格退回报废会计处理
  • 固定资产清理属于
  • 出售商标使用权收入计入什么科目
  • 合同印花税进哪个科目
  • 保险合同有啥用
  • 代账公司收取服务费能开增值税票吗?
  • 个人劳务费发票个人所得税
  • 企业新建厂房
  • 出租房产如何交土地使用税
  • 交通费进项税抵扣计算
  • 租入固定资产装修
  • 个人劳动供给曲线图
  • 支付电费的税费怎么算
  • 单位价值5000元二手设备怎么算
  • php获取远程文件数据
  • php中的变量都以什么开头
  • php闭包和回调函数
  • php的魔术函数
  • 支付水电费增值税账务处理
  • 财政专户资金是专项资金吗
  • 刚成立的公司招人能去吗
  • 小企业会计准则适用于哪些企业
  • 进项税额转出会造成增值税应纳税额
  • 购买图书可以开增值税专票么?
  • 公账转给员工工资情况说明怎么写
  • 开民工工资专户函模板
  • 职工福利费允许扣除比例
  • 增值税纳税申报表在哪里查询
  • 主营业务成本和营业成本的区别
  • 疫情期间上班,公司是否给员工买保险
  • 核价人员要对哪些方面的价格进行核定,怎么核?
  • 汇兑记载事项及内容
  • 企业购买商场的资本金要求是多少
  • 住宿发票费率是多少
  • 有限公司股东撤资退股
  • 房产置换怎么做
  • 优惠券抵扣账务处理流程
  • 结转存货跌价准备是什么意思
  • 过路费纸质发票可以抵扣增值税吗
  • 其他业务收入如何填写增值税申报表
  • 主营业务成本包括工资吗
  • 会计总账怎么登账
  • 不含税价换算成含税价怎么算
  • 营业外支出有哪些费用
  • 阿里云 远程连接
  • sql必会知识
  • WP8版Creative Camera:相机详情介绍(图文)
  • Kali(debian) Too many open files 错误处理办法
  • win7系统开启无线服务
  • 与web站点和web页面
  • PQV2ISECURITY.EXE - PQV2ISECURITY是什么进程 有什么用
  • windows7禁止开机启动
  • win10里的运行
  • win8怎么没有无线网图标不见了
  • win7系统每次关机都安装更新
  • linux解密
  • windows进程太多
  • unity Toggle Groud
  • vs2012配置opencv4.8
  • fflogs隐藏数据
  • CustomPropertyDrawer-Change the height of Property field
  • jquery滚动到底部加载数据
  • mongoose操作
  • jquery插件大全
  • js判断ua
  • 记账凭证编制的依据可以用
  • 国地税合并6月15日挂牌
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设