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

  • 极光tv投屏弹幕怎么设置(极光tv投屏弹幕大小)

    极光tv投屏弹幕怎么设置(极光tv投屏弹幕大小)

  • 任务管理器快捷键(任务管理器快捷键没反应)

    任务管理器快捷键(任务管理器快捷键没反应)

  • iphonexr自带膜吗(苹果xr新机有没有贴钢化膜)

    iphonexr自带膜吗(苹果xr新机有没有贴钢化膜)

  • 我抖音怎么看不到别人在线(我抖音怎么看不到好友在线状态)

    我抖音怎么看不到别人在线(我抖音怎么看不到好友在线状态)

  • 苹果语音备忘录可以录多久(苹果语音备忘录怎么重命名)

    苹果语音备忘录可以录多久(苹果语音备忘录怎么重命名)

  • 删除微信app聊天记录还能恢复吗(删除微信app聊天记录)

    删除微信app聊天记录还能恢复吗(删除微信app聊天记录)

  • 抖音开通小店后怎么上传商品(抖音开通小店后怎么开通橱窗)

    抖音开通小店后怎么上传商品(抖音开通小店后怎么开通橱窗)

  • 电脑截屏快捷方式是什么(电脑截屏快捷方便)

    电脑截屏快捷方式是什么(电脑截屏快捷方便)

  • 笔记本一晚上不关机可以吗(笔记本一晚上不关机会怎么样)

    笔记本一晚上不关机可以吗(笔记本一晚上不关机会怎么样)

  • 怎么下载小电影下载到手机(怎么下载小电影发给微信朋友)

    怎么下载小电影下载到手机(怎么下载小电影发给微信朋友)

  • 苹果手机充不进电怎么回事?(苹果手机充不进电是什么问题)

    苹果手机充不进电怎么回事?(苹果手机充不进电是什么问题)

  • 手机屏幕边缘一道发黄(手机屏幕边缘一圈淡绿色)

    手机屏幕边缘一道发黄(手机屏幕边缘一圈淡绿色)

  • 抖音未成年可以开直播吗(抖音未成年可以刷礼物吗)

    抖音未成年可以开直播吗(抖音未成年可以刷礼物吗)

  • 微信零钱记录删除后还能看到吗(微信零钱记录删除)

    微信零钱记录删除后还能看到吗(微信零钱记录删除)

  • gps和gprs的区别(gprs定位和gps定位哪个更准确)

    gps和gprs的区别(gprs定位和gps定位哪个更准确)

  • 淘宝怎么查删过的订单(如何查询删除的淘宝记录)

    淘宝怎么查删过的订单(如何查询删除的淘宝记录)

  • 手机有存储卡为什么音乐没有了(手机有存储卡为什么空间没扩大)

    手机有存储卡为什么音乐没有了(手机有存储卡为什么空间没扩大)

  • 手机迅雷高级设置在哪(手机迅雷权限设置)

    手机迅雷高级设置在哪(手机迅雷权限设置)

  • 计算机软件通常分为(计算机软件)

    计算机软件通常分为(计算机软件)

  • vue设置时长方法(vue怎么延长时间)

    vue设置时长方法(vue怎么延长时间)

  • cnnic是什么意思(cnnic第51次中国互联网报告)

    cnnic是什么意思(cnnic第51次中国互联网报告)

  • 抖音怎么不让别人艾特我(抖音怎么不让别人看到我的喜欢)

    抖音怎么不让别人艾特我(抖音怎么不让别人看到我的喜欢)

  • 电话号码停机多久销号(电话号码停机多久不能用)

    电话号码停机多久销号(电话号码停机多久不能用)

  • win10用uefi启动更快吗(uefi windows 10)

    win10用uefi启动更快吗(uefi windows 10)

  • 怎么清空当日微信步数(微信怎么清空当天的聊天记录)

    怎么清空当日微信步数(微信怎么清空当天的聊天记录)

  • 锦州税务师考试在哪个学校
  • 暂估入库收到发票后怎么做分录
  • 港资企业定义
  • 上期金额和本期金额是什么意思
  • 咨询服务费开票税率
  • 股票分红会冲抵成本吗
  • 所得税季报填错了已经申报了
  • 资产负债表其他流动资产包括什么
  • 增值税销项税额影响入账金额吗
  • 农村电网维护费会计分录
  • 资产负债表的应付职工薪酬怎么填
  • 短期投资款取消退回计入什么科目?
  • 旅游费开票内容
  • 绿化工程上税多少
  • 税控盘怎么使用
  • 如何在国税网站下载财务报表
  • 未按规定安装使用税控装置
  • 薪酬费用属于什么科目
  • 公司招投标卖标书的收入款财务作什么科目?
  • 如何增加发票数量和额度
  • 企业是核定征收还是查账征收怎么查
  • 融资租赁纳税人是指
  • 没有认缴到位的股票
  • 普通支票如何转账
  • 如何查出账外收入
  • 固定资产不入账是谁的责任
  • 年底会计人员要做什么
  • win10待机自动关机软件
  • regsync.exe - regsync是什么进程 有什么用
  • 存放同业款项和拆出资金在资产负债表中
  • 一般纳税人辅导期什么意思
  • codecline
  • laravel搭建
  • 加油费属于什么费用类别的
  • 新政府会计准则三大特点
  • php采集源码
  • 即插即用系统
  • php自动识别验证码
  • ps如何打圈内环形文字怎么调间距
  • 固定资产实收资本按照什么入账
  • python生成器定义
  • 什么是技术服务工程师
  • 专利权研发成功的会计分录
  • 工程施工企业的增值税税率是多少
  • 费用报销单票据怎么填
  • 代收代付进项税转出吗
  • 专利费用计入什么会计科目
  • 材料暂估成本的账务处理
  • 进出口会计账务处理
  • 哪些企业可以不计提盈余公积
  • 劳务报酬收入是否含税
  • 小微企业所得税优惠政策最新2023
  • 销售退回 所得税
  • 专款支出和事业支出
  • 从外面买回来的鸡蛋能孵出小鸡吗
  • 美元利息结汇时结汇项目是什么
  • 暂扣员工工资应怎么处理
  • 销项税和进项税的借贷方向
  • 旅游应当提示参加团队旅游的旅游者按照规定购买什么
  • 银行入息是入几个月的
  • 凭证填制的标准要求
  • 开设专栏方案
  • 建账时应取得哪些资料
  • mysql 临时表
  • 怎么改windowsxp版本
  • wingate.exe - wingate是什么进程
  • win8开机进入开始界面
  • adsl怎么设置上网
  • nodejs函数返回值
  • 批处理执行bat文件
  • 恶意软件清理
  • 基于专业性的家校双向互动,需要家长的学校教育参与
  • python数据导出
  • jquery ajax后台返回list,前台用jquery遍历list的实现
  • JavaScript中的NaN代表什么
  • jqueryui easyui
  • javascript面向对象精要
  • centos7如何安装
  • 体检机构 保险
  • 控件未安装或控件版本过低
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设