实验 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 让生产者慢下来。
小练习
- 把
maxsize=4改成maxsize=1,观察producer输出节奏。 - 把 worker 数量改成 1,比较总耗时。
- 删除最后放入
None的循环,worker 会一直等在queue.get()。验证完用Ctrl-C停掉。