实验 8:Queue 先从 put/get 开始
前面几节处理的是“一批任务已经在手里”。Queue 解决的是另一个问题:任务可能一边产生,一边被处理。
这一节先不用多个 worker,只看一个生产者、一个消费者。
运行:
bash
python3 examples/asyncio_demos/08_queue_basics.py最小写法
生产者放数据:
python
await queue.put(item)消费者取数据:
python
item = await queue.get()队列为空时,queue.get() 会等待。等生产者放入数据,消费者继续往下执行。
task_done 和 join
示例里消费者处理完一个 item 后会调用:
python
queue.task_done()主函数用:
python
await queue.join()join() 等的是“已经放进队列的项目都处理完了”。如果你忘了 task_done(),join() 就可能一直等。
怎么让消费者停下来
这个 Demo 用 None 当停止信号:
python
await queue.put(None)消费者拿到 None 后返回:
python
if item is None:
return这叫 sentinel 写法。它不神秘,就是在队列里放一个约定好的结束标记。
小练习
- 删除
queue.task_done(),程序会卡在await queue.join()。验证完用Ctrl-C停掉。 - 把
None换成字符串"STOP",同步修改类型标注。 - 在消费者里加
await asyncio.sleep(0.5),观察生产者是否会先把所有 item 放完。这个例子里的 Queue 没有maxsize,所以上游不会被压慢;下一节会改掉这一点。