使用 asyncio.gather 与 asyncio.wait的区别
时间: 2024-09-17 21:00:16 浏览: 42
`asyncio.gather` 和 `asyncio.wait` 都是 Python 的 asyncio 库中的两个用于并发执行多个异步任务的方法,但它们之间有显著的不同。
1. **asyncio.gather()**:
- 这个函数用于一次性调度并等待多个协程(coroutines)的完成。它接受一组协程作为参数,返回一个 Future 对象,当所有协程都完成时,Future 将解析为包含每个协程结果的一个元组。如果任何一个协程抛出了异常,那么整个 `gather` 也会立即停止,返回的 Future 将包含第一个失败协程的错误信息。
- 示例:
```python
import asyncio
async def task1():
await asyncio.sleep(1)
return "Task1 result"
async def task2():
await asyncio.sleep(2)
return "Task2 result"
tasks = [task1(), task2()]
results = await asyncio.gather(*tasks)
print(results) # {"Task1 result", "Task2 result"}
```
2. **asyncio.wait()**:
- `wait` 函数则更底层,它接收一个可迭代的协程集合和一个超时时间。它会返回两个列表:一个是已完成的任务,另一个是还在运行或挂起的任务。这意味着你需要手动处理这些返回值,可能需要使用 `asyncio.all_tasks()` 或者 `asyncio.shield()` 来确保所有任务都被正确地收集和处理。
- 示例:
```python
import asyncio
async def task1():
await asyncio.sleep(1)
return "Task1 result"
async def task2():
await asyncio.sleep(2)
return "Task2 result"
tasks = [task1(), task2()]
done, pending = await asyncio.wait(tasks)
completed_results = [t.result() for t in done]
print(completed_results)
```
注意,如果你不提供超时时间,`wait` 只会在所有任务完成后才会结束。
总结来说,`asyncio.gather()` 是一个简洁的方式,适合于不需要太多控制流程、只需要等待所有任务完成的情况;而 `asyncio.wait()` 提供了更多的灵活性,但需要手动管理任务的状态。如果你不确定具体需求,`gather` 更加推荐,因为它更易于理解和使用。
阅读全文