标准答案
- 入队时容量满则等待或返回失败,出队时为空则等待或返回空。
- 关闭操作要唤醒所有等待者,让生产者和消费者都能结束而不是永久阻塞。
- 任务异常要由消费者捕获并交给重试或失败处理器,不能让工作线程静默退出。
题目解析
有界队列必须明确满和空时的行为:生产者可以等待、超时或拒绝,消费者可以等待、超时或得到关闭结果。等待条件要在循环中重新检查,不能假设一次唤醒就满足。
close 要改变共享状态并唤醒所有等待者,关闭后禁止新任务;消费者还要根据策略排空、转移或丢弃剩余任务,并释放执行槽和连接。
队列本身只负责进程内协调。任务持久化、重复投递、崩溃恢复和失败审计要由额外状态或可靠消息存储承担,消费者异常不能静默退出。
代码示例
接口边界应显式表达关闭和失败:
TypeScript
interface BoundedQueue<T> {
put(value: T, signal?: AbortSignal): Promise<void>
take(signal?: AbortSignal): Promise<T | undefined>
close(): void
}常见误区
- 误区:关闭后仍接受新任务。改正:在入队和关闭状态之间使用同一同步边界,关闭后明确返回失败。
- 误区:等待者没有被 close 唤醒。改正:close 时广播唤醒生产者和消费者,让它们检查关闭状态并退出。
- 误区:消费者异常没有保存失败任务。改正:记录任务状态,按错误类型重试、转失败队列或补偿。