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

  • 员工出差车费如何报销
  • 税收申报减免
  • 生产成本怎么计算
  • 本月无销售额,但是有进项,需要认证吗
  • 公司团体体检的洽谈
  • 融资租赁租入固定资产折旧可以税前扣除吗
  • 来料加工企业的人工工资计入什么费用
  • 公司接受投资会计科目
  • 红字信息表跨月了还能开吗
  • 发工资多发了可以要回吗
  • 未分配利润调整会计分录
  • 建筑企业预缴增值税计算
  • 隐名股东违法吗
  • 个人独资企业是法人吗
  • 贸易公司给客户开发票
  • 社保可以在税前扣除吗
  • 预收房租款如何入账
  • 卷式发票属于什么税
  • 一月份的工作日是多少天
  • 自然灾害造成的存货净损失计入什么科目
  • 服务不动产和无形资产扣除项目有哪些
  • 个税申报密码是什么意思
  • 汇算清缴的年报在哪里查询
  • 4S店装修改造费帐务处理?
  • 汇算清缴后的会计分录
  • linux命令“ln file1 file2”的含义是
  • 银行保证金账务处理流程
  • 企业所得税计税依据
  • 二级资本债记哪个科目
  • php dechex
  • 销售返利计入什么费用
  • 融资租赁怎么做到表外
  • 夸克到底有什么用
  • javascript获取input的值并计算
  • php目录浏览
  • 未分配利润可以弥补亏损吗
  • 小企业会计准则适用于哪些企业
  • 库存现金每月终了由谁清点
  • jetbrainsnews
  • 直接转销法能不能用
  • 没授权的帝国cms作为商用行吗
  • javascript和java有什么区别
  • mysql复制一条记录
  • php访问mysql数据库函数
  • 发票开具与小票的关系是怎样的
  • 制造车间买来刀具怎么办
  • 如何在sql server中建立一个表
  • mysql死锁的处理方法
  • 在建工程转入
  • 部分货物退回怎么开票
  • 物流货损怎样处理
  • 视同销售包括哪些行为?
  • 公共电话亭设计案例
  • 增值税起征点有多少
  • 免抵退 免退
  • 代驾服务费属于哪个税收编码
  • 基本户有什么用
  • 间接持股比例如何分析
  • 暂估入账的材料对材料成本差异率
  • 合同资产减值准备对应科目
  • 试制流程
  • mysql如何导出数据
  • 批量替换多个wps文档的内容
  • ubuntu安装超详细教程
  • win10mobile官网
  • win8中的wps点打印预览就卡
  • windows10周年更新
  • 体验Win8灵活分屏贴靠功能图文介绍
  • linux系统中文输入法切换不出来
  • cocos2dx入门
  • perl脚本执行顺序
  • ssh自动输入密码登录
  • 批处理提取文件夹中的文件
  • python中的条件判断和循环语句
  • js基本代码
  • python随机数random.choice
  • 北京海淀大集一览表?
  • 税务部门的扣款协议
  • 爱信诺开票系统怎么安装
  • 电子缴款凭证可以用于报销吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设