为什么要用asyncio.wait
时间: 2023-12-17 08:03:40 浏览: 35
asyncio.wait() 方法是Python内置的asyncio库提供的一种协程并发运行的方法。它可以同时运行多个协程,并且会在它们完成时返回一个由Future实例组成的集合。 这个方法可以用于避免程序中的阻塞,并且能够使协程之间更好的协作。在并发编程中,使用asyncio.wait()可以显著提高程序的性能和效率。
相关问题
asyncio.gather和asyncio.wait的区别
asyncio.gather()和asyncio.wait()都是用于并发地运行多个协程的方法,但它们之间有一些区别。
asyncio.gather()用于收集一组协程并将它们同时运行,它会等待所有协程执行完成后才返回结果。当您需要同时运行多个独立的协程时,使用asyncio.gather()是非常方便的选择。此外,asyncio.gather()会在所有协程完成时返回一个由所有协程结果组成的列表。
相反,asyncio.wait()也是用于并发运行多个协程,但它与asyncio.gather()不同的是,它并不直接返回所有协程的结果。相反,它返回一个包含已完成协程和未完成协程的元组。您可以使用已完成的协程列表来处理结果,或者使用未完成的协程列表来继续等待这些协程的完成。
因此,当您需要同时运行多个独立的协程,并需要处理它们返回的结果时,使用asyncio.gather()是最好的选择。而当您需要同时运行多个独立的协程,并需要在它们完成时采取进一步行动时,则使用asyncio.wait()更加合适。
await asyncio.wait()什么作用
asyncio.wait()用于等待一组协程对象的完成。它接收一个由协程对象组成的集合,等待它们完成,返回完成的协程对象集合和未完成的协程对象集合。如果参数return_when指定为asyncio.FIRST_COMPLETED,它将立即返回一个完成的协程对象集合和未完成的协程对象集合,即使还有其它协程对象没有完成。
例如:
```
import asyncio
async def coroutine1():
await asyncio.sleep(1)
print("coroutine1 has completed")
async def coroutine2():
await asyncio.sleep(2)
print("coroutine2 has completed")
async def main():
tasks = [asyncio.create_task(coroutine1()), asyncio.create_task(coroutine2())]
done, pending = await asyncio.wait(tasks)
for task in done:
print(f"{task} has completed")
asyncio.run(main())
```
运行结果:
```
coroutine1 has completed
<Future finished result=None> has completed
coroutine2 has completed
<Future finished result=None> has completed
```
在这个例子中,我们定义了两个协程对象coroutine1和coroutine2,它们分别休眠1秒和2秒后输出结果。在main函数中,我们创建了这两个协程对象的任务,并用asyncio.wait()等待它们完成。最终,我们得到了完成的协程对象集合(done),其中包含两个Future对象,分别表示coroutine1和coroutine2的完成,同时还有一个空的未完成的协程对象集合(pending)。接下来,我们遍历完成的协程对象集合,输出完成的任务对象和它们的结果。