关于asyncio 执行过程的问题。内含代码,对执行顺序有点不解
import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
print('Waiting: ', x)
await asyncio.sleep(x)
return 'Done after {}s'.format(x)
async def main():
coroutine1 = do_some_work(1)
coroutine2 = do_some_work(2)
coroutine3 = do_some_work(4)
tasks = [
asyncio.ensure_future(coroutine1),
asyncio.ensure_future(coroutine2),
asyncio.ensure_future(coroutine3)
]
dones, pendings = await asyncio.wait(tasks)
for task in dones:
print('Task ret: ', task.result())
start = now()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print('TIME: ', now() - start)
执行结果:
Waiting: 1
Waiting: 2
Waiting: 4
(这里隔了四秒)
Task ret: Done after 1s
Task ret: Done after 2s
Task ret: Done after 4s
TIME: 4.007018804550171
代码是网上复制的,不理解的是结果中那个停留了四秒。 按小白的理解,执行到第一个await asyncio.sleep(x)的时候跳 到第二个阻塞了又到第三个,然后第三个阻塞了不是应该跳回第一个吗? 然后跳 回函数内执行FRO循环。会先打印第一个出来 然后两秒后再打印第二个,然后四秒后再打印第四个。
上面的执行结果变成是等最后一个四秒结束后,一起for出来了。这里不理解? 求大佬解惑
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
condition1,contdition2,condition3是塞在一个队列里面的,condition1先取出来执行,执行到sleep,轮到下一个,下一个继续,一直到最后一个;然后condition1睡好了,开始继续往下,执行完后,后面的跟上
你代码里使用的是:
而不是用 print 即时打印
所以逻辑是,运行完毕之后,收集了所有的结果,然后一口气都打印出来。
如果想要你设想的结果,直接在return前加一句即时打印就好了
要是想看点有趣的, 加个timeout试试,保证不需要等4秒,并且4秒的任务都没有机会结束,整个程序就结束了: