2023-02-16 18:57:51 来源:腾讯云
任务是异步程序的货币。在本节中,我们将仔细研究如何在我们的程序中与它们交互。
1. 任务生命周期
异步任务具有生命周期。首先,任务是从协程创建的。然后安排在事件循环中独立执行。在某个时候,它会运行。
在运行时它可能会被挂起,例如等待另一个协程或任务。它可能正常完成并返回结果或因异常而失败。
【资料图】
另一个协程可能会介入并取消任务。最终,它将完成并且无法再次执行。
我们可以将这个生命周期总结如下:
创建预定取消运行暂停结果Exception取消完成请注意,Suspended、Result、Exception 和 Canceled 本身并不是状态,它们是正在运行的任务的重要转换点。
下图总结了此生命周期,显示了每个阶段之间的转换。
现在我们已经从高层次上熟悉了任务的生命周期,让我们仔细看看每个阶段。
2. 如何检查任务状态
创建任务后,我们可以检查任务的状态。我们可能要检查两种状态,它们是:
任务是否完成任务是否取消让我们依次仔细看看每一个。
2.1. 检查任务是否完成
我们可以通过 done() 方法检查任务是否完成。如果任务完成,该方法返回 True,否则返回 False。
# check if a task is doneif task.done():# ...
如果任务有机会运行但现在不再运行,则该任务已完成。已安排的任务未完成。同样,正在运行的任务未完成。
如果出现以下情况,则完成任务:
协程正常结束。协程显式返回。协程中出现意外错误或异常任务被取消。2.2. 检查任务是否取消
我们可以通过 cancelled() 方法检查任务是否被取消。如果任务被取消,该方法返回 True,否则返回 False。
...# check if a task was canceledif task.cancelled():# ...
如果在任务上调用 cancel() 方法并成功完成,则任务被取消,例如 cancel() 返回 True。
如果未调用 cancel() 方法,或者调用了 cancel() 方法但未能取消任务,则不会取消任务。
3. 如何获取任务结果
我们可以通过 result() 方法获取任务的结果。这将返回由 Task 包装的协程的返回值,如果包装的协程没有显式返回值,则返回 None 。
...# get the return value from the wrapped coroutinevalue = task.result()
如果协程引发未处理的错误或异常,则在调用 result() 方法时会重新引发,并且可能需要处理。
...try:# get the return value from the wrapped coroutinevalue = task.result()except Exception:# task failed and there is no result
如果任务被取消,则在调用 result() 方法时会引发 CancelledError 异常,可能需要进行处理。
...try:# get the return value from the wrapped coroutinevalue = task.result()except asyncio.CancelledError:# task was canceled
因此,最好先检查任务是否已取消。
...# check if the task was not canceledif not task.cancelled():# get the return value from the wrapped coroutinevalue = task.result()else:# task was canceled
如果任务尚未完成,则在调用 result() 方法时会引发 InvalidStateError 异常,可能需要进行处理。
...try:# get the return value from the wrapped coroutinevalue = task.result()except asyncio.InvalidStateError:# task is not yet done
因此,最好先检查任务是否已完成。
...# check if the task is not doneif not task.done():await task# get the return value from the wrapped coroutinevalue = task.result()
4. 如何获取任务异常
任务包装的协程可能会引发未处理的异常。这实际上会取消任务。
我们可以通过 exception() 方法在任务包装的协程中检索未处理的异常。
...# get the exception raised by a taskexception = task.exception()
如果包装协程中未引发未处理的异常,则返回 None 值。
如果任务被取消,则在调用 exception() 方法时会引发 CancelledError 异常,可能需要对其进行处理。
...try:# get the exception raised by a taskexception = task.exception()except asyncio.CancelledError:# task was canceled
因此,最好先检查任务是否已取消。
...# check if the task was not canceledif not task.cancelled():# get the exception raised by a taskexception = task.exception()else:# task was canceled
如果任务尚未完成,则在调用 exception() 方法时会引发 InvalidStateError 异常,可能需要进行处理。
...try:# get the exception raised by a taskexception = task.exception()except asyncio.InvalidStateError:# task is not yet done
因此,最好先检查任务是否已完成。
...# check if the task is not doneif not task.done():await task# get the exception raised by a taskexception = task.exception()
5. 如何取消任务
我们可以通过 cancel() 方法取消计划任务。如果任务被取消,则 cancel 方法返回 True,否则返回 False。
...# cancel the taskwas_cancelled = task.cancel()
如果任务已经完成,则无法取消,cancel() 方法将返回 False,任务不会处于已取消状态。
下次任务有机会运行时,它将引发 CancelledError 异常。如果 CancelledError 异常未在包装协程内处理,任务将被取消。否则,如果在包装协程内处理了 CancelledError 异常,任务将不会被取消。
cancel() 方法还可以接受一个消息参数,该参数将在 CancelledError 的内容中使用。
6. 如何在任务中使用回调
我们可以通过 add_done_callback() 方法向任务添加完成回调函数。此方法采用任务完成时要调用的函数的名称。回调函数必须将 Task 实例作为参数。
# done callback functiondef handle(task):print(task) ...# register a done callback functiontask.add_done_callback(handle)
回想一下,当包装的协程返回时正常完成、引发未处理的异常或取消任务时,任务可能会完成。add_done_callback() 方法可用于添加或注册任意数量的 done 回调函数。
我们还可以通过 remove_done_callback() 函数删除或注销回调函数。
...# remove a done callback functiontask.remove_done_callback(handle)
7. 如何设置任务名称
一个任务可能有一个名字。如果多个任务是从同一个协程创建的,那么这个名称会很有用,我们需要一些方法以编程方式区分它们。当通过“名称”参数从协程创建任务时,可以设置名称。
...# create a task from a coroutinetask = asyncio.create_task(task_coroutine(), name="MyTask")
任务的名称也可以通过 set_name() 方法设置。
...# set the name of the tasktask.set_name("MyTask")
我们可以通过 get_name() 方法检索任务的名称。
...# get the name of a taskname = task.get_name()
标签: 编程算法
- 加快虚拟仿真实训基地建设 启动职业学校信息化建设试点很必要
- “双减”后如何在满足学生多样需求方面做“加法”?
- 处于生理活跃期且心理发展不成熟 高校开设公共卫生必修课很必要
- 价格低于相应蔬菜零售价 西安投放约1万吨政府储备蔬菜
- 深受年轻消费群体所青睐 国潮风商品成为年货新选择
知识
- 他把银行卡卖给骗子,“黑吃黑”“截胡”十万元
- “老司机”4S店试驾豪车 结果油门当刹车撞了
- 新开工改造城镇老旧小区5.34万个
- 发动巡河志愿者2万余名 “用心护好每一条河”
- 假客服的套路:伪装成大平台客服,层层布局引人上钩
人物
- Python 异步: 使用和查询任务(8)
- 安徽肥西:智慧教育助力集团化办学 天天速讯
- 【收评】原油日内上涨2.44% 机构称美原油超预期累库、美元强势对油价形成较大压力
- 环球时讯:02月16日12时江西抚州疫情数据 阳了以后为什么会腰疼?应该怎么办?
- 即时看!四川省2023年初级、高级会计考试报名本月28日截止
- 湖南有色职院:开学第一课 安全每时刻_天天播报
- 多特vs切尔西评分:多特门将科贝尔8.6分最高 速看料
- 市场定位策略有哪几种 当前短讯
- 网游好听的名字大全 全球看热讯
- 《锦绣南歌》黑莲花人设的女主为什么会成为爆款?只因做到这两点
- 今日精选:QQ号码测吉凶
- [浦东]竹园小学:竹娃乐缤纷 携手同成长——2022学年第二学期长岛校区开学日活动
- 轩辕传奇药师怎么玩最厉害_《轩辕传奇》平民药师装备和器灵的选择心得
- 长沙银行医保卡怎么激活银行卡功能|焦点讯息
- 民生一卡通属于什么银行|环球微资讯
- 当前热门:dnf怎么强化武器 强化步骤详解
- ChatGPT,谁是成长最快企业? 全球独家
- 灭火 小说_火灭中文小说
- 环球热议:额济纳旗胡杨林旅游最佳时间 额济纳旗胡杨林旅游最佳时间简述
- 保障人民群众用药安全 推动医药产业高质量发展
- 今日热讯:美元折纸鲨鱼说明
- 全球快讯:秋分吃什么好_秋分吃什么传统食物
- 摄影中有什么构图技巧 世界消息
- 关注:02月15日06时四川自贡疫情数据 阳了以后为什么会腰疼?应该怎么办?
- 当前简讯:省运会足球项目青少年组男子乙组A决赛石家庄队夺冠
- 三八妇女节的来历和习俗 每日视点
- 遂宁新型冠状病毒肺炎疫情:2月15日遂宁疫情最新消息今天数据统计情况通报
- 王者荣耀实名认证18岁以下怎么实名认证
- 全球热门:从颐和园到雍和宫乘车路线怎么走?
- 电脑开机后进不了桌面怎么办
- 白色情人节是送男生礼物吗_天天实时
- 最新少年中国说朗诵稿全版
- 【天天报资讯】后防不稳!本赛季欧冠淘汰赛球队中,仅巴黎小组赛每场都失球
- 调查:超六成非婚青年相信爱情,年龄越小占比越高-环球信息
- 产品方案全新突破,新华三携手伙伴角逐万亿下沉市场
- 教师见习期工作总结
- 环球微速讯:我的情人不是“人”
- 以艺术为媒,架起东西之桥
- 送女生手表 全球报资讯
- 给男朋友生日礼物送什么好
- 传说中的麦田怪圈有没有在中国出现过?
- 报道:安宁市2014年度推进依法行政工作计划
- 什么是酸奶机
- 环球消息!中概股走高 叮咚买菜绩后飙升23%
- 天坑鹰猎菜瓜结局
- 全球快看点丨郑州一八联合国际学校怎么样_郑州一八联合国际学校
- 国网天津电力经研院:组织开展宁河220千伏重建工程现场踏勘
- 全球热议:女人生日礼物送什么东西比较好
- 《我们的滚烫人生2》以热爱注解“摩旅”,发掘公益力量 每日精选
- 安徽发布政策 降低民营和中小微企业融资成本
精彩阅读
- 76人消息:裁判报告得利,大帝展现领袖气质,防守悍将有望加盟 焦点热议
- 全球即时看!四川凉山救援队队员赴叙利亚地震灾区救援
- 管子·法禁_关于管子·法禁介绍 焦点热议
- 每日速读!送长辈生日礼物男士
- 德系车传统技能?因排放作弊 奔驰或被30万车主索赔|天天讯息
- 小鹏汽车欲提升自主产能 代工模式或逐渐边缘化
- 怎样修改电脑开机密码_怎样修改电脑密码|每日热文
- 育沛图片_育沛
- 中年男生日礼物
- 每日速递:购房直降佣金!我爱我家全国六城启动首届“春笋购房节”
- 月薪两万!董事长招保镖?相关上市公司或已深跌或曾闪崩
- 每日看点!我送点什么
- 家乡的风景作文600字_家乡的风景作文
- 引力魔方图片可以加文字吗?有什么用?
- 环球今热点:成都市纪委监委通报8起年轻干部腐败问题典型案件
- 视点!涓囩綉鍏徃鍏ㄥ悕_中国万网企业邮箱
- 今天最新消息 驻南非使馆发布调整赴华签证申请有关事宜的通知
- 机器灵砍菜刀这首歌的故事_机器灵砍菜刀背后故事-焦点滚动
- 小于1的科学计数法的定义_科学计数法的定义
- 新闻稿发布小技巧(怎么网上发布曝光新闻事件)_环球视点
- 今日视点:玩具小程序开发有什么价值?-广州商城小程序开发
- 环球即时:送给学姐的毕业礼物
- 每日播报!人之怒杰森为什么中枪没死
- kfc礼品卡多少钱
- 恒生科技指数跌幅扩大至3%,万国数据跌超7% 每日看点
- 酷家乐如何自己绘制户型图 每日热门
- 银轮股份(002126)2月9日主力资金净卖出412.09万元
- 安阳汤阴礼品盒加工厂|全球头条
- 东风日产启辰d50_东风日产及启辰D50怎么样
- 焦点速读:下雨天发朋友圈的句子心情短句搞笑(通用273句)
- 短讯!演员傅羽佳,傅羽佳图片,傅羽佳演过的电视剧
- 天天快看点丨蛙课网官网_蛙课网
- 都德的简介_点都德茶楼简介|天天热消息
- CBA新消息!赵睿伤病未愈,广东男篮一日三练,刘权标基本退役!
- 环球微头条丨救援日记:来不及多想,向马拉蒂亚震区出发!
- 云南罗平县消防救援大队专职消防员的薪资待遇怎么样? 全球快讯
- 2022年情人节限定皮肤王者荣耀 这几款你肯定得知道 当前视讯
- 金溢科技(002869)2月9日主力资金净卖出989.30万元
- 鹩哥吃什么 鹩哥的食物简述
- 公积金多少可以贷款买房?公积金每月200可以贷多少
- 【时快讯】【特别关注】他们值守的身影 温暖了元宵夜
- 樱桃小丸子爷爷图片_樱桃小丸子爷爷_环球快资讯
- 热文:随缘是什么意思 词语随缘什么意思
- “杀猪盘”APP 成功潜入苹果和谷歌应用商店
- 大尺度美国都市犯罪黄暴剧:暴力动作犯罪大片,罪犯冒名顶替警长|全球快看点
- 世界新资讯:笔记本电脑什么牌子最好用?
- 17岁高中生的一个恶作剧,让日本餐饮大恐慌_天天亮点
- 热点在线丨《建国大业》观后感优秀范文两篇
- 之的笔顺笔画怎么写的近义词|世界热闻
- CJJ/T82-99城市绿化工程施工及验收规范