Python 异步任务取消机制解析

python异步任务取消是协作式中断,需协程主动响应cancellederror异常;cancel()仅设状态并下一次await时抛出该异常,纯cpu计算或捕获不重抛会导致取消失效。

Python 的异步任务取消不是“立刻终止”,而是通过协作式中断实现的——任务需主动检查取消信号并自行退出。核心在于 asyncio.Taskcancel() 方法触发 CancelledError 异常,而该异常只有在任务下一次 await 时才会被抛出。

取消的本质:抛出 CancelledError 并等待协程响应

调用 task.cancel() 不会强行杀掉协程,只是将任务状态设为“已取消”,并在其下一次挂起点(如 await asyncio.sleep(1)await reader.read())注入 CancelledError。若协程未 await 任何可取消的 awaitable,或捕获了异常却不重新抛出,取消就会“失效”。

  • 必须在 await 表达式处才能中断;纯 CPU 计算(如 for i in range(10**8))会阻塞取消
  • try/except CancelledError 后若不 raise,任务会继续运行,看似“取消失败”
  • 使用 asyncio.shield() 包裹的协程无法被外部取消(除非内部也主动响应)

安全取消的典型模式

编写可取消协程时,应显式处理取消逻辑,尤其在清理资源或退出循环时:

  • 在长循环中定期 await asyncio.sleep(0)await asyncio_yield()(自定义零延迟挂起点),让取消信号有机会进入
  • async with 管理异步资源(如连接、锁),确保 __aexit__ 在取消时仍能执行
  • 捕获 CancelledError 后完成必要清理,再 raise 向上传播(除非明确要抑制取消)

示例:

详解Android中AsyncTask的使用 中文WORD版

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。本文档主要讲述的是详解Android中AsyncTask的使用;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

async def fetch_with_timeout(url, timeout=5):
    try:
        async with aiohttp.ClientSession() as session:
            async with session.get(url, timeout=timeout) as resp:
                return await resp.text()
    except asyncio.CancelledError:
        print("任务被取消,正在清理...")
        # 这里可关闭未完成的流、释放锁等
        raise  # 必须重抛,否则取消被吞

批量取消与超时控制

实际开发中,常需对一组任务统一管理:

  • asyncio.wait(tasks, timeout=3.0) 可设定整体超时,超时后未完成的任务仍处于 pending 状态,需手动 cancel
  • asyncio.create_task() 创建的任务建议保存引用,便于后续取消;也可用 asyncio.all_tasks() 获取当前所有任务(慎用于生产)
  • 推荐组合使用 asyncio.timeout()(Python 3.11+)或 asyncio.wait_for() 实现带自动取消的超时逻辑

例如:

try:
    async with asyncio.timeout(2.0):
        result = await fetch_data()
except TimeoutError:
    print("请求超时,已自动取消")

常见陷阱与规避方法

取消机制易被误用,导致行为不符合预期:

  • 同步阻塞阻断取消:避免在协程中调用 time.sleep()requests.get() 等同步阻塞函数;改用 await asyncio.sleep() 或异步客户端
  • 忽略返回值的 await:如 await asyncio.create_task(...) 会等待子任务完成,失去并发性;应先创建再统一 await 或 cancel
  • 未 await 的 task 对象被 GC:若创建 task 后未保存引用也未 await,可能被垃圾回收,导致取消失效或资源泄漏

不复杂但容易忽略。

相关推荐:

暗黑4S14神话暗金掉落机制介绍

暗黑破坏神 4 新赛季 S14 将于 7 月 1 日正式拉开帷幕,为玩家带来前所未有的游戏体验。还上线了许多内容,那么有不少小伙伴好奇S14赛季神话暗金怎么掉落,下面就来告诉大家。 暗黑4S14神话暗金掉落机制介绍 神话暗金 3.0 机制 所有先祖暗金(900装等)都有机会变成紫色神话。 神话效果:全词缀满 roll + 暗金特性+30% 。 获取途径: 1.自然掉落:所有 900 暗金概率变神话...

奥奇传说光明王精灵定位及技能解析

奥奇传说光明王技能介绍,光明王是新出的精灵,每个大回合开始时,令自身获得效果:第一次受击时清除目标所有增益效果并吸收目标50气势,第二次受击时吸收目标15%全属性,第三次受击时获得50%减伤(持续1个大回合)。 奥奇传说光明王精灵定位及技能解析: 一、精灵定位 光系召唤 群体免疫 二、精灵属性 光 三、精灵职业 平衡,召唤师,源起 四、属性评分 生命:A|攻击:S|物防:S|魔防:S|速度:A 五...

酋长你别跑魔女技能解析

酋长你别跑魔女技能是什么,部落中的狼群首领是一位人类少女,她不仅与狼有着与生俱来的默契,能知晓彼此心意,还能熟练使用早已失传,仅在典籍中有所记载的古老魔法。 酋长你别跑魔女技能解析: 一、技能 技能-魔狼 1技能:攻击有20%几率召唤1头造成30%伤害的魔狼,最多存在5头魔狼,魔狼存在20秒。 2技能:魔狼的攻击提高60%,存在时间变为永久。 3技能:魔狼的攻速提高50%,魔狼还会燃起地狱光,每秒...

重返未来:1999奠基石角色技能解析

重返未来1999奠基石技能一览,莫基石是一名围绕反击体系的岩系输出型角色,她在场期间能够减少己方全体受到的伤害,并在友方释放反击时附加现实创伤。在通过自身咒语进入反制状态后,无需敌人攻击,奠基石会在回合结束时释放自身的反击攻击敌方全体。释放至终的仪式时,她能进一步减少己方全体受到的伤害,并释放更加强大的反击造成高额现实创伤。 重返未来:1999奠基石角色技能解析: 洞悉被动有3个重点: 1、奠基石...

原神八重神子机制改动介绍

就在最近原神上线了月之八版本,上线了许多内容有新角色,新武器,还有新的机制——星超导,不少角色的机制也有改动,那么有不少小伙伴好奇八重神子机制改动了什么,下面就来告诉大家。 原神八重神子机制改动介绍 【更多星超导机制】 ① 雷冰触发的星超导反应本身没有伤害,只生成棱晶、辉域。 ② 辉域持续6秒,重复触发刷新持续时间。 ③ 辉域每4秒便会结算一次期间的全队雷冰附着次数总和,不同次数决定为全队提供的雷...

原神北斗机制改动介绍

就在最近原神上线了月之八版本,上线了许多内容有新角色,新武器,还有新的机制——星超导,不少角色的机制也有改动,那么有不少小伙伴好奇北斗机制改动了什么,下面就来告诉大家。 原神北斗机制改动介绍 【关于E-Q-E】 ① “长E-Q-长E”耗时较长,更多是北斗作为起手角色或搭配一些增益/技能持续时间较长的队友。 ② 若北斗已有高充能,也可考虑“长E-Q-点E”节省Q后的北斗站场时间。 【更多星超导机制】...

原神迪奥娜机制改动介绍

就在最近原神上线了月之八版本,上线了许多内容有新角色,新武器,还有新的机制——星超导,不少角色的机制也有改动,那么有不少小伙伴好奇迪奥娜机制改动了什么,下面就来告诉大家。 原神迪奥娜机制改动介绍 【更多星超导机制】 ① 雷冰触发的星超导反应本身没有伤害,只生成棱晶、辉域。 ② 辉域持续6秒,重复触发刷新持续时间。 ③ 辉域每4秒便会结算一次期间的全队雷冰附着次数总和,不同次数决定为全队提供的雷/冰...

消息称徕卡 M11-R 相机最快今年底登场:换用 60.3Mp 长光辰芯国产 CMOS、取消机背按键

感谢网友 BIOS 的线索投递! 7 月 1 日消息,据 LeicaRumors 报道,徕卡旗下 M11-R 相机将于今年底至明年初登场,该机将换用全新 CMOS 传感器,同时砍掉机背按键,换用更大的显示屏,整体操作逻辑预计将类似当年的徕卡 T/TL 系列。事实上,今年 4 月的时候国产 CMOS 图像传感器供应商长光辰芯宣布与徕卡合作,称“正在为下一代徕卡相机定制一款高性能 CMOS 图像传感器...