标准答案
- 有界队列把慢消费者转化为生产者等待或拒绝,避免内存无限增长。
- 消费者要在成功、失败和取消路径调用 task_done,才能让 join 正确结束。
- 停止生产后等待队列排空,或通过取消和失败策略让消费者退出。
- 任务应有 ID、超时、幂等和失败处理,Queue 本身不提供持久化。
题目解析
asyncio.Queue 的 maxsize 是进程内背压边界,队列满时生产者等待或超时。它不提供持久化、跨进程投递和崩溃恢复,重要任务需要外部队列或数据库状态。
消费者每取出一项都必须在成功、失败和取消路径调用 task_done,join 才能准确表示未完成任务。关闭时要先停止生产,再排空、取消或转移任务。
消费者异常不能静默退出。任务应有 ID、状态、超时、幂等和失败处理,队列大小、最老任务和生产/消费速率要可监控。
常见误区
- 误区:Queue 无界且无限 put。改正:设置 maxsize、获取超时和满载策略。
- 误区:漏掉 task_done 导致 shutdown 卡住。改正:每个 get 都在 finally 中完成 task_done。
- 误区:消费者异常退出没有告警和补偿。改正:记录失败任务并通过重试、死信或人工处理恢复。