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

  • 淘宝新手推广如何获取关注度(新手做淘宝怎么做推广)

    淘宝新手推广如何获取关注度(新手做淘宝怎么做推广)

  • 请为你的父母骄傲(请为你的父母骄傲梧桐)

    请为你的父母骄傲(请为你的父母骄傲梧桐)

  • 华为mpencil连不上(华为mpencil连不上蓝牙也充不上电)

    华为mpencil连不上(华为mpencil连不上蓝牙也充不上电)

  • 电池温度40度正常吗(电池温度40度正常嘛)

    电池温度40度正常吗(电池温度40度正常嘛)

  • 微博好友热搜在哪里看?(微博好友热搜在哪里查看)

    微博好友热搜在哪里看?(微博好友热搜在哪里查看)

  • iphone11右侧边缘发热(苹果11右侧)

    iphone11右侧边缘发热(苹果11右侧)

  • 屏幕乱跳是内屏坏了吗(屏幕乱跳是内屏坏了吗苹果)

    屏幕乱跳是内屏坏了吗(屏幕乱跳是内屏坏了吗苹果)

  • 电脑突然自动关机了再按电源打不开(电脑突然自动关机重启)

    电脑突然自动关机了再按电源打不开(电脑突然自动关机重启)

  • 8700k跟9600k差距多大(8700和9600k哪个好)

    8700k跟9600k差距多大(8700和9600k哪个好)

  • win7激活工具是干嘛的(如何激活win7系统)

    win7激活工具是干嘛的(如何激活win7系统)

  • mqa92ch a是国行吗(mqa92ch/a是苹果什么型号)

    mqa92ch a是国行吗(mqa92ch/a是苹果什么型号)

  • 华为性能模式在哪(华为性能模式开启)

    华为性能模式在哪(华为性能模式开启)

  • 拼多多复活卡找不到了(拼多多复活卡可以复活砍价免费拿吗)

    拼多多复活卡找不到了(拼多多复活卡可以复活砍价免费拿吗)

  • 操作系统是一组什么程序(一个操作系统都应该有哪些基本组成?)

    操作系统是一组什么程序(一个操作系统都应该有哪些基本组成?)

  • 什么是瀑布屏(瀑布屏和曲面屏区别)

    什么是瀑布屏(瀑布屏和曲面屏区别)

  • 移动td一lte版什么意思(中国移动td-lte收费)

    移动td一lte版什么意思(中国移动td-lte收费)

  • qqdiy怎么取消(qq怎么取消自己的所在地)

    qqdiy怎么取消(qq怎么取消自己的所在地)

  • p30pro防水吗(p30pro防水级别多少)

    p30pro防水吗(p30pro防水级别多少)

  • defaultuser0是什么(defaultusee0)

    defaultuser0是什么(defaultusee0)

  • Windows 10如何开启硬件加速GPU计划(windows10如何开启wifi)

    Windows 10如何开启硬件加速GPU计划(windows10如何开启wifi)

  • 安装pnpm踩的坑(npp怎么安装)

    安装pnpm踩的坑(npp怎么安装)

  • Vue连接WebSocket后,监听消息并读取消息内容(onmessage事件),解决将内容赋值到data的属性失败的问题(vuecli websocket)

    Vue连接WebSocket后,监听消息并读取消息内容(onmessage事件),解决将内容赋值到data的属性失败的问题(vuecli websocket)

  • web前端开发期末大作业 ——个人主页(可自取源码)(web前端开发学什么)

    web前端开发期末大作业 ——个人主页(可自取源码)(web前端开发学什么)

  • vue3 Element Plus按钮点击之后颜色不会还原的解决方案(element ui vue 3)

    vue3 Element Plus按钮点击之后颜色不会还原的解决方案(element ui vue 3)

  • DEDECMS不规则的列表实现方法 每隔5行加一虚线(div不规则排版)

    DEDECMS不规则的列表实现方法 每隔5行加一虚线(div不规则排版)

  • 增值税视同销售账务处理怎么做?
  • 备用金无发票怎么做账
  • 公司注销固定资产怎么处理税怎么交
  • 2019劳务公司务怎么处理
  • 实际发生应收账款坏账时的会计处理
  • 销售费用与管理的关系
  • 企业所得税税前扣除和不扣除的区别
  • 免抵退税的账务处理
  • 购进材料无发票会计分录
  • 员工奖金分两次发怎么交税?
  • 公司宣传牌模板
  • 生产车间计提折旧分录
  • 咨询费可以入账吗
  • 反倾销税由谁缴纳
  • 小规模纳税人需要每月清卡吗
  • 总资产报酬率可以用净利润计算吗
  • 每个季度企业要缴纳什么税
  • 自然人借款给企业的涉税风险
  • 小规模30万免税政策
  • 其他公司代付工资怎么做
  • 购进免税农产品再销售免税吗
  • 现金短缺或溢余的账务处理业务题
  • 托收承付结算方式
  • 过路费企业所得税汇算清缴计入什么科目?
  • 客户少付货款怎么做账
  • 商会会费收取
  • 上报汇总完成,远程清卡清不了
  • 给别人的返利是属于什么费用
  • 无偿捐赠增值税计算公式
  • 从农民手中收购农产品增值税处理
  • chrom无法访问
  • 企业租赁汽车交什么税
  • 用公司资质应交什么费用
  • 农产品增值税进项税额
  • 代开票作废税未退该如何分录?
  • win10电脑记事本在哪
  • 付款结算单范本
  • 哪些费用可以用医保
  • 美丽的大中华
  • 自然保护绘画
  • 隐隐作痛怎么写
  • 商誉减值后
  • 背书转让的步骤
  • 如何在vue项目中运行后端
  • 付检测费会计分录
  • vue知识点汇总
  • critical_section 结构
  • 商品房测绘收费标准
  • 需要缴纳企业所得税的企业类型
  • 什么条件可以免于起诉
  • 活动委托书范本
  • 试运行收入会计分录
  • phpcms怎么用
  • 残疾人个人所得税减免政策2023
  • 增值税退税流程怎么操作
  • 小微企业和民营企业的区别
  • 小微小型微利企业表述正确的有
  • sql server触发器实例
  • 个人工资薪金如何零申报
  • 会计科目长期待摊费用
  • 进项发票认证后暂不抵扣
  • 处理报废的固定资产账务处理
  • 房地产企业抵押借款
  • 工程项目必须购买保险吗
  • 补充养老保险和年金
  • 营业税包含
  • 多余备用金记账会计分录
  • 猪肉蔬菜是免税农产品吗
  • 账务处理程序和财务处理程序
  • mysql使用教程
  • windosxp无法启动
  • ubuntu如何配置
  • lsass.exe
  • win7共享按钮灰色
  • windows 8怎么样
  • bc1998录制的css视频教程推荐新手看下
  • js数组添加元素的方法
  • javascript函数如何定义及其作用
  • 中医药文化进校园活动
  • 金坛归属南京
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设