多个异步呼叫阻止

Mar*_*nen 5 python asynchronous python-3.x async-await python-3.6

我的代码:

import asyncio

async def test(i):
    await asyncio.sleep(i)
    print('test')

async def main():
    await test(2)
    await test(2)
    await test(2)

asyncio.get_event_loop().run_forever(main())
Run Code Online (Sandbox Code Playgroud)

我原本希望它休眠三秒钟,然后打印'test'三遍,但是要等到每秒钟'test'分别等待2秒钟(所以最后一次'test'打印才6秒钟)。

我有什么不对的地方,怎么解决?

dec*_*eze 6

await暂停当前​​函数的执行,直到将来返回为止。在中test,使函数等待2秒钟直到asyncio.sleep返回,然后再打印。在中main,它使该函数等待直到test返回(执行print此操作之后再sleep返回),然后再继续执行next await test

如果要同时执行所有操作test,并在两秒钟后一次打印它们,则可以使用asyncio.gather

async def main():
    await asyncio.gather(test(2), test(2), test(2))
Run Code Online (Sandbox Code Playgroud)

这样可以同时test在事件循环上安排三个协程,并等待它们的所有组合结果,这些结果将在约2秒内到达。

您也可以在不等待协程完成的情况下开火并忘记协程:

def main():
    asyncio.ensure_future(test(2))
    asyncio.ensure_future(test(2))
    asyncio.ensure_future(test(2))
Run Code Online (Sandbox Code Playgroud)