Skip to content

实验 9:Queue 工作池

上一节只有一个消费者。现在加到三个 worker,并给队列设置 maxsize。这时你能看到 Queue 的另一个用处:生产太快时,让生产者也等一等。

运行:

bash
python3 examples/asyncio_demos/09_queue_worker_pool.py

工作池长什么样

生产者只管放 item:

python
await queue.put(item)

worker 负责取 item、处理、调用 task_done()

python
item = await queue.get()
try:
    ...
finally:
    queue.task_done()

maxsize 在管什么

python
queue = asyncio.Queue(maxsize=4)

队列最多积压 4 个 item。队列满时,await queue.put(item) 会暂停。等某个 worker 取走 item,生产者才能继续放。

这么做是为了避免内存里越堆越多。下游处理慢时,上游必须知道“别再放了,等一下”。

什么时候用 Queue,不用 Semaphore

如果你已经拿到一批 URL,只想限制同时请求数量,Semaphore 很直接。

如果任务不断产生,或者你想让几个 worker 一直取任务处理,Queue 更合适。Queue 还可以用 maxsize 让生产者慢下来。

小练习

  1. maxsize=4 改成 maxsize=1,观察 producer 输出节奏。
  2. 把 worker 数量改成 1,比较总耗时。
  3. 删除最后放入 None 的循环,worker 会一直等在 queue.get()。验证完用 Ctrl-C 停掉。

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