2017-04-20 102 views
1

我的代码:多个异步调用阻塞

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

await暂停执行当前函数,直到将来返回。在test,这使得该功能等待2秒,直到asyncio.sleep已返回,在打印之前。在main中,它将使函数等到test已返回(它在之后执行的操作,它在sleep返回后执行),然后再继续下一行,并执行下一个。同时

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

这个时间表3个test协同程序的事件循环:

如果你想在同一时间执行所有test并让他们每个打印两秒钟后一次,你可以使用asyncio.gather时间并等待他们的所有综合结果,这些结果将在约2秒内到达。

你也可以发射后不管的协同程序,而不等待其完成:

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