正在回答
同学,你好。
1、会执行store.put(i)添加数据,当执行到a1的asyncio.sleep(random.randint(1, 5))将协程挂起,该语句是挂起的条件,此时去执行a2(),继续添加数据,执行a2的asyncio.sleep()语句时会将协程挂起,执行r1,从队列中取数据,继续执行输出语句,此时挂起条件结束,则会返回去继续执行a1()a2()中的输出语句。也有可能还没有执行到r1,a1的挂起条件结束会从a2中返回去继续执行a1
随机挂起的时间是不固定的,因此执行顺序并不是每次都一样的。同学可以在程序中打断点以debug的模式运行程序,可以更好的了解执行过程
2、await store.put(i)会执行put添加数据,await asyncio.sleep(random.randint(1, 5))会将协程挂起执行其他协程。异步的好处就是在请求之后不一定要死等,而是可以做其他事情。
如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~
以先输出reduce的代码为例:
import asyncio import random async def add(store,name): for i in range(5): num = "{0}-{1}".format(name,i) await store.put(i) await asyncio.sleep(random.randint(1,3)) print("{2} add one>>>>>{0},size:{1}".format(num,store.qsize(),name)) async def reduce(store): for i in range(10): rest = await store.get() print("reduce one-----{0},size:{1}".format(rest,store.qsize())) if __name__ == '__main__': store = asyncio.Queue(maxsize=5) a1 = add(store,"a1") a2 = add(store,"a2") r1 = reduce(store) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.gather(a1,a2,r1)) loop.close()
我学到的await就是:“暂停当前协程,转而执行await后面的代码(put、sleep等),执行完了之后再回来执行下面行的代码”。那我觉得他就应该是a1、a2、r1一行接一行地执行下来啊,不存在什么开始执行了还没来得及输出啊。既然老师说“a1、a2、r1依次执行”,那为什么还会有“这个还没执行完那个就开始执行了”。这三者我也没看出来是怎么实现互相await把控制权传来传去的。老师能用ppt做个图解吗?我真的完全没懂。
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星