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

  • ipad pro有高刷新率吗(ipadpro2020高刷新率)

    ipad pro有高刷新率吗(ipadpro2020高刷新率)

  • 苹果微信边写边译怎么打开(苹果微信边写边写怎么弄)

    苹果微信边写边译怎么打开(苹果微信边写边写怎么弄)

  • 微信没有经常联系的朋友为什么要验证(微信没有经常联系的朋友怎么解封)

    微信没有经常联系的朋友为什么要验证(微信没有经常联系的朋友怎么解封)

  • 快手不小心举报了别人怎么办(快手不小心举报了一个人那个人会怎么样)

    快手不小心举报了别人怎么办(快手不小心举报了一个人那个人会怎么样)

  • 抖音刷点赞会被限流吗

    抖音刷点赞会被限流吗

  • 小红书总是显示未找到指定服务器(小红书总是显示道路拥挤)

    小红书总是显示未找到指定服务器(小红书总是显示道路拥挤)

  • 小黑盒充值H币怎么退款(小黑盒用h币买游戏后怎么可以退钱)

    小黑盒充值H币怎么退款(小黑盒用h币买游戏后怎么可以退钱)

  • 触宝电话为啥不能用了(触宝电话怎么不能用)

    触宝电话为啥不能用了(触宝电话怎么不能用)

  • 佳能单反无法访问储存卡(佳能单反相机无法访问存储卡)

    佳能单反无法访问储存卡(佳能单反相机无法访问存储卡)

  • iqooneo自带的膜要换吗(iqooneo6手机自带的是什么膜)

    iqooneo自带的膜要换吗(iqooneo6手机自带的是什么膜)

  • 微信解除情侣空间对方知道吗(微信解除情侣空间对方有提示吗)

    微信解除情侣空间对方知道吗(微信解除情侣空间对方有提示吗)

  • 手机关联启动什么意思(手机关联启动怎么设置在哪)

    手机关联启动什么意思(手机关联启动怎么设置在哪)

  • 抖音绑定淘宝客失败是什么原因(抖音绑定淘宝客pid)

    抖音绑定淘宝客失败是什么原因(抖音绑定淘宝客pid)

  • 苹果XR系列和苹果11系列区别(苹果xr与苹果)

    苹果XR系列和苹果11系列区别(苹果xr与苹果)

  • 为什么苹果11的来电铃声很小(为什么苹果11的nfc用不了)

    为什么苹果11的来电铃声很小(为什么苹果11的nfc用不了)

  • 在文档里怎样画线段图(在文档里怎样画线段和直线)

    在文档里怎样画线段图(在文档里怎样画线段和直线)

  • 淘宝申请换货怎么处理(淘宝申请换货怎么上门取件)

    淘宝申请换货怎么处理(淘宝申请换货怎么上门取件)

  • 手机怎么找回浏览器历史记录(手机怎么找回浏览器记录)

    手机怎么找回浏览器历史记录(手机怎么找回浏览器记录)

  • 滴滴成交率怎样恢复(滴滴成交率下降了怎么才能涨上来)

    滴滴成交率怎样恢复(滴滴成交率下降了怎么才能涨上来)

  • 小米9机身有多少厘米(小米9机身多厚)

    小米9机身有多少厘米(小米9机身多厚)

  • 怎么恢复视频(怎么恢复视频画质)

    怎么恢复视频(怎么恢复视频画质)

  • QQPCTray.exe是什么进程 QQPCTray.exe文件介绍

    QQPCTray.exe是什么进程 QQPCTray.exe文件介绍

  • Python中的子进程是什么(python 子进程通信)

    Python中的子进程是什么(python 子进程通信)

  • 那些车不用交税
  • 一张发票能分开做帐务处理吗
  • 增值税专用发票抵扣期限
  • 有主营业务收入就一定有销项税吗
  • 融资租赁和经营性租赁区别
  • 申报时入库税款怎么入账
  • 小规模纳税人专票和普票区别
  • 利润表管理费用怎么算
  • 非居民企业直接投资居民企业取得股息
  • 期末存货跌价准备金额的确定
  • 取暖补贴国家标准
  • 我国流转税的税种组成为
  • 外出经营预缴税款,回所在地如何申报
  • 工业设备基础
  • 如果增值税发票丢了好的怎么办有谁交罚熬一
  • 小规模纳税人收入账务处理
  • 土地使用税与房产税的区别
  • 关于两套账老板和会计须知的4个点
  • 企业上市过程中遇到的困难
  • 租赁产生的成本有哪些
  • 员工借款收不回来账务处理
  • 关于诉讼费减半如何减的问题
  • 企业打款认证计入什么科目
  • 坏账准备转回影响应交所得税吗
  • 苹果13promax哪个颜色最贵
  • 增值税转出未交增值税是什么意思
  • php获取远程文件数据
  • 销售折扣的税票怎么开
  • 财务报表分析方法有哪些?各有什么优缺点?
  • PHP isset()与empty()的使用区别详解
  • css禁用button按钮
  • 悬崖边上的门
  • 基于javaweb的图书馆管理系统
  • 人脸检测5种方式
  • vue做项目的流程
  • 端午节发现金怎么说
  • 增值税期末留抵退税
  • 银行流水要去哪里打
  • 航空公司开具的代订机票费可以抵扣吗
  • 一次性伤残补助金怎么查询进度
  • 分公司财务负责人要求
  • 销售返利可以税前扣除吗
  • 开红字发票需要做收回原发票吗?
  • 行政事业单位银行开户规定
  • 工程设备租赁有哪些
  • 注册资本认缴制的利弊
  • 公司购买的五金怎么入账
  • 进销存怎么看
  • 个人所得税税前扣除凭证
  • 赠送产品会计分录怎么写
  • 以前年度多记成本费用税前扣除,今年要怎么做分录冲销
  • 支付广告费是什么活动
  • 总公司中标走子公司账户违法吗
  • 提前还贷款计算机
  • 持有至到期投资改名为
  • 如何防止sql注入及数据安全问题
  • mysql存储数据的原理
  • linux命令实现
  • windows2000自动登陆
  • u盘安装centos7安装详细图解
  • android7应用程序开发教程
  • win 7系统无法删除系统文件
  • win8.1怎么用
  • gsicon.exe是什么进程 作用是什么 gsicon进程查询
  • win7应用程序无法正常启动
  • 2015年win10共发布135个安全补丁 创历年之最
  • win8开始菜单变为win10
  • jquery和原生js性能
  • dos怎么开启
  • perl $?
  • opengl编译
  • 可输入文字查找的软件
  • jquery插件开发方法
  • easyui怎么用
  • 详解增发万亿国债细节
  • html应用css
  • android获取手机的基本信息
  • XRegExp 0.2: Now With Named Capture
  • 货车可申请停保吗
  • 新疆维吾尔自治区民族团结进步工作条例
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设