标准答案
- 任务收到 CancelledError 后应释放连接、锁和临时资源,并在完成清理后继续传播取消。
- asyncio.timeout 或 wait_for 只控制等待边界,不能强制停止不配合的阻塞调用。
- 重试要共享同一个 deadline,不能捕获所有异常包括取消后继续重试。
- 不可逆副作用要用幂等键和最终状态查询处理取消时的未知结果。
题目解析
CancelledError 表示协作取消,不应被当作普通业务失败吞掉。任务应在 finally 释放连接、锁和临时文件,完成必要清理后继续传播取消。
asyncio.timeout/wait_for 只控制等待边界,无法强制终止不配合的阻塞线程或已经发出的外部请求。超时后的任务和副作用要通过状态查询、幂等或补偿收敛。
重试共享同一 deadline,不能捕获 BaseException/取消后继续重试。业务写入需要先确认结果未知,再决定是否安全重放。
常见误区
- 误区:捕获取消后在 finally 之外继续工作。改正:完成有限清理后重新抛出 CancelledError。
- 误区:超时后后台任务无限运行。改正:保存并取消 Task,等待退出或转成独立可恢复任务。
- 误区:取消后直接重复提交扣款。改正:使用幂等键或查询最终状态,不能用取消推断副作用未发生。