asyncio.Queue() 对象管理任务队列示例
时间: 2023-08-26 14:03:37 浏览: 140
c# queue 队列例子
5星 · 资源好评率100%
好的,下面是一个使用 asyncio.Queue() 对象管理任务队列的示例代码:
```python
import asyncio
async def worker(name, queue):
while True:
# 从队列中获取任务
task = await queue.get()
print(f'{name} got task: {task}')
# 模拟任务处理过程
await asyncio.sleep(1)
# 标记任务完成
queue.task_done()
async def main():
# 创建队列对象
queue = asyncio.Queue()
# 启动两个 worker
workers = [worker(f'worker-{i}', queue) for i in range(2)]
await asyncio.gather(*workers)
# 向队列中添加任务
for i in range(5):
await queue.put(f'task-{i}')
# 等待所有任务完成
await queue.join()
print('All tasks done!')
# 运行主程序
asyncio.run(main())
```
在这个示例中,我们创建了一个 `worker` 协程函数,它会不断地从队列中获取任务,并进行处理。我们启动了两个这样的协程,以便能够并发地处理任务。
在主程序中,我们创建了一个 `asyncio.Queue()` 对象,用于存放待执行的任务。然后向队列中添加了 5 个任务。通过 `await queue.join()`,我们等待所有任务完成。
当一个任务完成时,我们需要调用 `queue.task_done()` 来标记任务已经完成。这样,`await queue.join()` 才会在所有任务都完成的时候返回。
运行上述代码,你会看到类似如下的输出:
```
worker-0 got task: task-0
worker-1 got task: task-1
worker-0 got task: task-2
worker-1 got task: task-3
worker-0 got task: task-4
All tasks done!
```
这表明两个 worker 协程函数同时从队列中获取任务,然后交替地处理它们。当所有任务都完成时,程序输出了 `All tasks done!`。
阅读全文