news 2026/4/23 10:46:33

[RL]协程asyncio.CancelledError

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[RL]协程asyncio.CancelledError

好的,我们来精确地分析在您提供的long_running_task代码中,except asyncio.CancelledError被执行的精确条件

asyncdeflong_running_task():print("任务开始,进入 try 块...")try:# ... 代码 A ...awaitasyncio.sleep(1)# <--- 这是一个 await 点# ... 代码 B ...exceptasyncio.CancelledError:# ... 清理代码 ...

except asyncio.CancelledError:这个块会被执行,需要同时满足以下两个条件

  1. 任务必须已经被标记为“取消”: 在long_running_task外部的某个地方,必须已经调用了task.cancel()。这就像“解雇通知”已经被递送到了员工的桌上。

  2. 控制流必须位于try块内部,并且到达一个await表达式: 当 Python 的await机制准备暂停当前协程时,asyncio事件循环会检查该任务是否被标记为“取消”。

    • 如果“是”: 事件循环不会去执行await后面的表达式(比如asyncio.sleep(1))。相反,它会立即在await表达式这个位置注入并抛出一个asyncio.CancelledError异常
    • 如果“否”: 正常执行await后面的表达式,暂停协程并等待结果。

精确的执行路径分析

让我们用您提供的代码来走一遍精确的路径:

asyncdeflong_running_task():print("任务开始,进入 try 块...")try:print("步骤 1: 开始一项耗时操作...")# (1) 这里没有 await,任务不会检查取消状态importtime time.sleep(2)print("步骤 2: 同步操作完成。")# (2) 到达第一个 await 点!# 在这里,事件循环会检查 task.is_cancelled()awaitasyncio.sleep(1)# (3) 如果没有被取消,会执行到这里print("步骤 3: 任务未被取消,继续执行...")awaitasyncio.sleep(1)print("步骤 4: 任务正常完成。")exceptasyncio.CancelledError:# (4) 异常处理块print("步骤 E1: 捕获到 CancelledError!开始清理工作...")# ...

main函数中,我们在task启动后很快就调用了task.cancel()

  1. long_running_task开始执行,打印“任务开始…”、“步骤 1…”。
  2. 执行time.sleep(2)。在这 2 秒内,main函数已经调用了task.cancel()。现在,task对象内部的“取消”标志位已经被设置为True。但是,long_running_task对此一无所知,因为它正被一个同步的sleep阻塞,没有机会与事件循环交互。
  3. time.sleep(2)结束,打印“步骤 2…”。
  4. 代码执行到await asyncio.sleep(1)。这是关键点!
    • await表达式将控制权交还给事件循环。
    • 事件循环在准备执行asyncio.sleep(1)之前,会检查这个task的状态。
    • 它发现:“哦,这个任务的取消标志位是True!”
    • 于是,事件循环决定不执行asyncio.sleep(1)。它立即在这个await的位置抛出一个asyncio.CancelledError
  5. 这个CancelledError异常被try...except块捕获。
  6. 程序的控制流立即跳转except asyncio.CancelledError:块,开始执行print("步骤 E1: ...")

因此,except块被执行的精确时刻是:当一个已经被cancel()的任务,在try块内执行到它的第一个await暂停点时。


如果try块内没有await会怎样?

这是一个非常好的思考题。

asyncdefno_await_in_try():try:print("进入 try 块,但这里没有 await。")time.sleep(3)print("try 块结束。")exceptasyncio.CancelledError:print("永远不会执行到这里!")# 任务在 try 块结束后,在这里的 await 点才抛出异常awaitasyncio.sleep(0)print("也永远不会执行到这里。")asyncdefmain_test_no_await():task=asyncio.create_task(no_await_in_try())awaitasyncio.sleep(0.1)task.cancel()try:awaittaskexceptasyncio.CancelledError:print("Main 捕获到了 CancelledError。")

运行main_test_no_await的输出会是:

进入 try 块,但这里没有 await。 (等待 3 秒) try 块结束。 Main 捕获到了 CancelledError。

分析:

  • task.cancel()被调用时,no_await_in_try正在time.sleep(3)
  • sleep结束后,try...except块正常退出,except块完全没有被执行,因为在try块的作用域内,没有任何await点来触发CancelledError的抛出。
  • no_await_in_try执行到try块之后的await asyncio.sleep(0)时,它终于有机会检查取消状态,并在这里抛出了CancelledError
  • 这个异常因为没有在no_await_in_try内部被捕获,所以被传播了出去,最终被main_test_no_await中的await task捕获。

结论:try...except CancelledError:只能捕获到try块内部的await所触发的CancelledError。这是理解asyncio异常处理和任务取消的关键。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 12:36:02

城市数字治理中的大模型应用架构:以上海云宇星空大模型为例

当下&#xff0c;政务大模型的落地路径&#xff0c;正在分化出两条截然不同的跑道&#xff1a;当不少地方政府选择以“轻量化”的方式&#xff0c;将DeepSeek等通用模型快速接入政务系统时&#xff0c;上海市规划和自然资源局给出了一条更“重”、更深的路线。近日&#xff0c;…

作者头像 李华
网站建设 2026/4/17 19:09:50

2025最新!10个AI论文网站测评:本科生毕业论文救星大公开

2025最新&#xff01;10个AI论文网站测评&#xff1a;本科生毕业论文救星大公开 2025年AI论文写作工具测评&#xff1a;精准匹配本科生需求 随着人工智能技术的不断进步&#xff0c;越来越多的学术辅助工具进入高校师生的视野。对于本科生而言&#xff0c;撰写毕业论文不仅是学…

作者头像 李华
网站建设 2026/4/23 1:37:29

Perfecxion.ai发布:生产级安全编程数据集防范AI代码漏洞

这项由Perfecxion.ai公司的Scott Thornton领导的研究于2025年12月发表在arXiv预印本服务器上&#xff0c;论文编号为arXiv:2512.18542v1&#xff0c;有兴趣深入了解的读者可以通过该编号查询完整论文。想象你正在厨房里跟着一个看起来经验丰富的厨师学做菜。这位厨师动作娴熟&a…

作者头像 李华
网站建设 2026/4/22 19:04:41

LoPA:上海交大与华为联手破解AI推理新困境

说起人工智能的文字生成&#xff0c;我们可以把它想象成一个非常特殊的打字机。传统的AI语言模型就像一个按部就班的打字员&#xff0c;必须一个字母一个字母地慢慢敲打&#xff0c;前面的字母没打完&#xff0c;后面的就得等着。但最近&#xff0c;上海交通大学和华为公司的研…

作者头像 李华
网站建设 2026/4/18 22:51:20

2025终极AI论文神器:9款免费工具实测,查重<13%原创度高超靠谱!

一、2025 AI论文工具权威测评总览&#xff1a;9款免费工具核心能力对比 你是否还在为论文选题抓耳挠腮&#xff1f;为文献综述熬到凌晨&#xff1f;为重复率超标反复修改&#xff1f;2025年&#xff0c;AI论文工具已进入“全功能覆盖”时代——从选题、写作到降重、引用&#…

作者头像 李华
网站建设 2026/4/21 14:09:23

AI创业心得:录视频量产技巧+广告行业价格战痛点分享

大家好&#xff0c;我是AI技术爱好者熊哥。最近忙录视频、测试AIStarter和PanelAI&#xff0c;占了大部分时间。分享创业心得&#xff0c;从录视频量产到广告行业被欠款“割”&#xff0c;坚持开发AI项目不易。希望激励开发者&#xff0c;避免恶性竞争。 录视频的日常&#xff…

作者头像 李华