请告诉新手 asyncio 中的 wait 工作原理的细微差别。示例代码。
import asyncio
async def some_task():
print("Задача начата")
await asyncio.sleep(2)
print("Задача завершена")
async def main():
task = asyncio.create_task(some_task())
#await asyncio.sleep(5)
await task
#await asyncio.sleep(5)
asyncio.run(main())
- 如果我只是运行await task,一切都清楚了,任务在2秒内运行
- 如果我在await任务之前设置await asyncio.sleep(5),那么程序的总执行时间是5秒,程序内部的任务是2秒
- 如果我在await任务之后设置await asyncio.sleep(5),那么程序的总执行时间约为7秒,程序内部的任务为2秒
为什么在一种情况下两个任务“并行”执行,而在另一种情况下“顺序”执行?提前致谢。
让我们看看您描述的代码选项:
当您开始等待 5 秒时,任务
task已经在运行,您在 中启动了它asyncio.create_task。所以当你在5秒后开始等待时task,它就已经完成了。这样,原来 2s 的工作task发生在你做这件事的那一刻sleep,不需要添加这 2s,总时间与 time 一致sleep。这些任务是并行执行的(如果有足够的线程,而且通常有足够的线程)。在这种情况下,事实证明,您首先等待任务
task2 秒,然后才开始等待sleep5 秒,因此您得到 2 秒的等待 + 5 秒的等待 = 7 秒。其寓意是:如果可能的话,尝试不按顺序等待任务,而是并行等待。将那些可以同时工作的任务收集在一个列表中并一次性等待它们,例如通过
await asyncio.wait.当没有这些任务的结果,无法再进一步浏览代码时,请执行此操作。在此之前,您不需要等待它们,创建它们并让它们在后台工作。并且只有那些必须严格按顺序执行的任务 - 依次等待它们,await每个此类任务都有一个单独的任务。