You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VSCode Jupyter Notebook中异步Python代码无法通过停止按钮优雅终止的问题

VSCode Jupyter Notebook中异步Python代码无法通过停止按钮优雅终止的问题

嘿,我完全懂你碰到的这个麻烦——在VSCode的Jupyter单元格里跑异步Python代码,点停止按钮想让代码优雅终止,本来以为靠asyncio.CancelledError捕获终止信号就行,结果实际用起来却有奇怪的行为,对吧?

首先得说清楚:Jupyter在运行异步单元格代码时,底层会把你的代码包装成一个asyncio任务,当你点击停止按钮,系统确实会给这个任务发送取消信号,触发CancelledError。但你的代码片段看起来没写完,大概率是没处理好异常捕获后的逻辑,或者有一些细节没注意到。

给你一个完整的可参考示例,能实现优雅终止:

import asyncio

async def main():
    try:
        print("异步任务启动中...")
        # 模拟你的异步操作,这里用asyncio.sleep代替实际业务逻辑
        await asyncio.sleep(3)
        print("异步任务顺利完成")
    except asyncio.CancelledError:
        print("捕获到停止信号,开始执行优雅清理...")
        # 这里添加你的清理逻辑:比如关闭打开的文件、取消子任务、断开网络连接等
        raise  # 记得重新抛出异常,让Jupyter明确知道任务已被取消

await main()

这里有几个关键点要注意:

  • 把异步逻辑封装到单独的协程函数(比如main)里,这样异常捕获和清理逻辑更清晰;
  • 捕获CancelledError后一定要执行必要的清理操作,这才是“优雅终止”的核心;
  • 清理完成后重新抛出CancelledError,让Jupyter的运行时能正确识别任务被取消,避免出现残留的异步任务或者异常状态。

另外还要避个坑:如果你的代码里用了同步阻塞的操作(比如time.sleep()),那事件循环会被卡住,CancelledError根本没法触发。所以所有需要等待的操作,一定要用asyncio提供的异步版本(比如asyncio.sleep())。

备注:内容来源于stack exchange,提问作者Eledwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:39:34