Skip to content

实验 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 写法。它不神秘,就是在队列里放一个约定好的结束标记。

小练习

  1. 删除 queue.task_done(),程序会卡在 await queue.join()。验证完用 Ctrl-C 停掉。
  2. None 换成字符串 "STOP",同步修改类型标注。
  3. 在消费者里加 await asyncio.sleep(0.5),观察生产者是否会先把所有 item 放完。这个例子里的 Queue 没有 maxsize,所以上游不会被压慢;下一节会改掉这一点。

面向学习目的的 Python asyncio 中文教程与 mini_asyncio 教学运行时。