python协程多任务asyncio不用gather
时间: 2023-10-14 22:30:38 浏览: 49
虽然 `asyncio.gather()` 是最常用的协程多任务并发执行的方式,但是有时候我们需要自定义协程的执行顺序,这时候就可以使用 `asyncio.wait()` 和 `asyncio.as_completed()`。
`asyncio.wait()` 可以接收一组协程对象,并发执行这些协程,等待所有协程执行完毕。它返回两个集合对象:已完成协程集合和未完成协程集合。通过这两个集合,我们可以得到已完成协程的执行结果。
```python
import asyncio
async def coro1():
await asyncio.sleep(1)
return 1
async def coro2():
await asyncio.sleep(2)
return 2
async def coro3():
await asyncio.sleep(3)
return 3
async def main():
coros = [coro1(), coro2(), coro3()]
done, pending = await asyncio.wait(coros)
for task in done:
print(task.result())
asyncio.run(main())
```
`asyncio.as_completed()` 也可以接收一组协程对象,并发执行这些协程,但是它不会等待所有协程执行完毕,而是在协程完成时立即返回该协程的执行结果。这样我们可以在协程完成时立即处理其执行结果,而不需要等待所有协程执行完毕。
```python
import asyncio
async def coro1():
await asyncio.sleep(1)
return 1
async def coro2():
await asyncio.sleep(2)
return 2
async def coro3():
await asyncio.sleep(3)
return 3
async def main():
coros = [coro1(), coro2(), coro3()]
for task in asyncio.as_completed(coros):
result = await task
print(result)
asyncio.run(main())
```
在上面的例子中,我们调用了 `asyncio.as_completed(coros)`,它会返回一个协程对象迭代器。我们使用 `for` 循环遍历这个迭代器,每次迭代返回一个已完成的协程对象。我们可以通过 `await task` 获取该协程的执行结果。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)