标准答案

  1. 使用 timeout 或显式 deadline 限制任务和 I/O,捕获超时后释放连接和任务资源。
  2. 下游 HTTP、数据库和消息客户端要使用支持 asyncio 的超时与取消 API。
  3. 重试次数和退避消耗同一 deadline,已没有剩余时间时快速失败。
  4. 超时后的写入或外部副作用需要状态查询和幂等,不应直接重复执行。

题目解析

入口应生成绝对 deadline,下游根据剩余预算设置连接、读取和执行超时。每层固定 5 秒会让总等待相加,重试还会进一步放大。

取消必须穿过 HTTP、数据库、队列和 executor;wait_for 不能强制停止已经在线程中运行的阻塞函数或外部副作用。

超时后要保存结果未知、释放连接并清理 Task。写操作需通过幂等键、状态查询和补偿处理,不能把取消当成未执行证明。

常见误区

  • 误区:每层固定设置 5 秒。改正:传播绝对 deadline,所有重试共享同一预算。
  • 误区:用 time.sleep 阻塞事件循环。改正:使用 asyncio.sleep 或隔离阻塞工作。
  • 误区:取消后留下后台 Task。改正:保存并取消 Task,等待清理或转成独立可恢复任务。

作者信息