标准答案

  1. 任务收到 CancelledError 后应释放连接、锁和临时资源,并在完成清理后继续传播取消。
  2. asyncio.timeout 或 wait_for 只控制等待边界,不能强制停止不配合的阻塞调用。
  3. 重试要共享同一个 deadline,不能捕获所有异常包括取消后继续重试。
  4. 不可逆副作用要用幂等键和最终状态查询处理取消时的未知结果。

题目解析

CancelledError 表示协作取消,不应被当作普通业务失败吞掉。任务应在 finally 释放连接、锁和临时文件,完成必要清理后继续传播取消。

asyncio.timeout/wait_for 只控制等待边界,无法强制终止不配合的阻塞线程或已经发出的外部请求。超时后的任务和副作用要通过状态查询、幂等或补偿收敛。

重试共享同一 deadline,不能捕获 BaseException/取消后继续重试。业务写入需要先确认结果未知,再决定是否安全重放。

常见误区

  • 误区:捕获取消后在 finally 之外继续工作。改正:完成有限清理后重新抛出 CancelledError。
  • 误区:超时后后台任务无限运行。改正:保存并取消 Task,等待退出或转成独立可恢复任务。
  • 误区:取消后直接重复提交扣款。改正:使用幂等键或查询最终状态,不能用取消推断副作用未发生。

作者信息