多个异步调用阻塞

时间:2017-04-20 11:39:19

标签: python python-3.x asynchronous 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())

我希望它能够睡三秒钟,然后打印出'test'三次,而是在每个'test'之前分别等待2秒(所以最后'test'打印出来6秒)。

我有什么理解错误,我如何解决这个问题按照我的预期工作?

1 个答案:

答案 0 :(得分:5)

await暂停执行当前函数,直到将来返回。在test中,这使得函数在打印之前等待2秒,直到asyncio.sleep返回。在main中,它使函数等到test返回(在print返回后sleep之后执行),然后继续执行下一行下一个await test

如果您想同时执行所有test并在两秒钟后立即打印它们,则可以使用asyncio.gather

async def main():
    await asyncio.gather(test(2), test(2), test(2))

这会同时在事件循环上安排三个test协同程序,并等待所有组合结果,这些结果将在~2秒内到达。

你也可以在没有等待完成的情况下解雇和忘记协同程序:

def main():
    asyncio.ensure_future(test(2))
    asyncio.ensure_future(test(2))
    asyncio.ensure_future(test(2))