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

  • 苹果5升级ios系统(苹果5升级ios7教程)(苹果5手机升级)

    苹果5升级ios系统(苹果5升级ios7教程)(苹果5手机升级)

  • 皮皮虾图片暂时无法保存(皮皮虾图片暂时无法保存为什么)

    皮皮虾图片暂时无法保存(皮皮虾图片暂时无法保存为什么)

  • 微信语音老是连接失败(微信语音老是连接中断是怎么回事)

    微信语音老是连接失败(微信语音老是连接中断是怎么回事)

  • 微博能不能单条屏蔽(微博能不能单条评论)

    微博能不能单条屏蔽(微博能不能单条评论)

  • 小米手机勿扰模式开启后怎么关闭(小米手机勿扰模式怎么设置白名单)

    小米手机勿扰模式开启后怎么关闭(小米手机勿扰模式怎么设置白名单)

  • 手机信号屏蔽器哪里买得到(手机信号屏蔽器哪个牌子好)

    手机信号屏蔽器哪里买得到(手机信号屏蔽器哪个牌子好)

  • vivox23黑屏也重启不了(vivox23开着机但屏幕黑了,怎么重启)

    vivox23黑屏也重启不了(vivox23开着机但屏幕黑了,怎么重启)

  • 快手怎么设置微信支付(快手怎么设置微信号)

    快手怎么设置微信支付(快手怎么设置微信号)

  • qq群匿名投票谁能看到(qq群匿名投票能看到谁投的谁吗)

    qq群匿名投票谁能看到(qq群匿名投票能看到谁投的谁吗)

  • 十分钟视频怎么发微信(十分钟视频怎么发微信朋友圈)

    十分钟视频怎么发微信(十分钟视频怎么发微信朋友圈)

  • 去小米售后需要带什么(去小米售后需要什么条件)

    去小米售后需要带什么(去小米售后需要什么条件)

  • 微信收不到消息提醒打开才能看到(微信收不到消息提醒怎么办)

    微信收不到消息提醒打开才能看到(微信收不到消息提醒怎么办)

  • 字符间距为标准是什么意思(字符间距为标准怎么调)

    字符间距为标准是什么意思(字符间距为标准怎么调)

  • word被锁无法修改(word2013被锁定无法编辑)

    word被锁无法修改(word2013被锁定无法编辑)

  • 华为手机照片导出到u盘(华为手机照片导入华为平板)

    华为手机照片导出到u盘(华为手机照片导入华为平板)

  • vivo手机怎么开启双卡(vivo手机怎么开启5g)

    vivo手机怎么开启双卡(vivo手机怎么开启5g)

  • 苹果更新一直不动了怎么办(为什么苹果更新一直不动)

    苹果更新一直不动了怎么办(为什么苹果更新一直不动)

  • dubbo与springcloud的区别(dubbo与springcloud区别)

    dubbo与springcloud的区别(dubbo与springcloud区别)

  • 苹果xsmax支持无线充电么(iphonexsmax参数配置)

    苹果xsmax支持无线充电么(iphonexsmax参数配置)

  • 小米5支持快充吗(小米支持快充的第三方充电头)

    小米5支持快充吗(小米支持快充的第三方充电头)

  • 小米9为什么没有耳机(小米9为什么没有声音了)

    小米9为什么没有耳机(小米9为什么没有声音了)

  • Nodejs安装及npm配置(超详细)(nodejs安装与配置)

    Nodejs安装及npm配置(超详细)(nodejs安装与配置)

  • XGBoost模型调参:GridSearchCV方法网格搜索优化参数(模型调参是调节什么)

    XGBoost模型调参:GridSearchCV方法网格搜索优化参数(模型调参是调节什么)

  • 文心一格,百度AI作画产品(文心一格百度)

    文心一格,百度AI作画产品(文心一格百度)

  • 什么是资本利得?
  • 劳务报酬支出 怎么做账
  • 企业所得税汇算清缴时间
  • 留存收益的个别资本成本率计算公式
  • 缴纳的增值税在资产负债表中怎么体现
  • 用携税宝怎么申报增值税
  • 印花税小于1元显示无需申报
  • 境外机构可以开通b股账户
  • 零售行业的销售员有加班费吗
  • 会务费账务处理
  • 会计凭证的填制与审核过程
  • 出口退税当期不得免征和抵扣的税额
  • 详解价外费用的会计核算
  • 公司不收员工的个人所得税怎么处理?
  • 金蝶K3如何设置套打
  • 异地预缴增值税后本地还要交吗
  • 事业编年底
  • 反倾销税税率查询
  • 个人所得税起征点什么时候调整的
  • 开具红字增值税专用发票是什么意思
  • 迁出注销类别怎么写
  • 小配件出口怎么报关
  • 土地使用权出让金
  • 预缴企业所得税是含税还是不含税
  • 行政事业单位如何加强财务管理
  • 几种更正法
  • 以前年度损益在借方
  • 销售使用过的板房如何缴税?
  • 办公费差旅费属于
  • 人民法院被收买了怎么办
  • 公司自有房屋出租 营业范围
  • 存货计划成本法好处
  • 其他应付款计入什么科目
  • 方正电脑如何做系统
  • 支付宝花呗服务升级有什么用
  • 个人所得税应该计入什么科目
  • 怎么登明细分类账
  • 业务招待费的账务处理金额
  • 登录页面的实现方式
  • blkid命令详解
  • postman密码
  • 代销手续费的税率
  • 除财政部门外,审计税务人民银行
  • 以公司名义开的诊所算个体工商户吗
  • 分公司是独立的诉讼主体吗
  • 购买的机械设备算固定资产吗
  • 企业进行成本核算时,应根据生产经营特点
  • sql server触发器在哪里?
  • 固定资产备抵科目有哪些
  • 水利建设基金计提会计分录
  • 餐饮不得抵扣进项税
  • 成本费用总额包括营业外支出吗
  • 运杂费计入什么会计科目
  • 应付账款平账调到哪个科目
  • 一次性收入怎么计税
  • 进项税大于销项税需要交增值税吗
  • 企业固定资产标准最新规定
  • SQL Server Parameter Sniffing及其改进方法
  • linux系统关机重启命令
  • 神州战神bios怎么进
  • linux服务器宕机排查
  • win10家庭版免费升级专业版密钥
  • 如何关闭自动启动项目
  • window10关闭
  • linux的命令行界面
  • win7系统的excel在哪里
  • linux zen3
  • Python连接access数据库
  • 修改cmdline
  • jquery动态添加样式
  • nodejs入门教程
  • 浏览图片的软件叫什么
  • php和python有什么区别
  • jquery创建表格
  • Rotate object with mouse click or touch in Unity3D
  • 国家税务局太原税务局官网
  • 收到虚开增值税专用发票怎么处理
  • 个人所得税选择那种方式更好
  • 如何申报印花税的流程
  • 城市维护建设税减半征收政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设