为了账号安全,请及时绑定邮箱和手机立即绑定

关于asyncio 执行过程的问题。内含代码,对执行顺序有点不解

关于asyncio 执行过程的问题。内含代码,对执行顺序有点不解

紫衣仙女 2019-05-22 16:03:49
importasyncioimporttimenow=lambda:time.time()asyncdefdo_some_work(x):print('Waiting:',x)awaitasyncio.sleep(x)return'Doneafter{}s'.format(x)asyncdefmain():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=awaitasyncio.wait(tasks)fortaskindones:print('Taskret:',task.result())start=now()loop=asyncio.get_event_loop()loop.run_until_complete(main())print('TIME:',now()-start)执行结果:Waiting:1Waiting:2Waiting:4(这里隔了四秒)Taskret:Doneafter1sTaskret:Doneafter2sTaskret:Doneafter4sTIME:4.007018804550171代码是网上复制的,不理解的是结果中那个停留了四秒。按小白的理解,执行到第一个awaitasyncio.sleep(x)的时候跳到第二个阻塞了又到第三个,然后第三个阻塞了不是应该跳回第一个吗?然后跳回函数内执行FRO循环。会先打印第一个出来然后两秒后再打印第二个,然后四秒后再打印第四个。上面的执行结果变成是等最后一个四秒结束后,一起for出来了。这里不理解?求大佬解惑
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

condition1,contdition2,condition3是塞在一个队列里面的,condition1先取出来执行,执行到sleep,轮到下一个,下一个继续,一直到最后一个;然后condition1睡好了,开始继续往下,执行完后,后面的跟上
                            
查看完整回答
反对 回复 2019-05-22
  • 2 回答
  • 0 关注
  • 576 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信