16:30,先执行reduce为什么size会不是0啊

16:30,先执行reduce为什么size会不是0啊

难道初始不是空吗?为什么上来size就有1?

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学,你好。

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))会将协程挂起执行其他协程。异步的好处就是在请求之后不一定要死等,而是可以做其他事情。

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 江民川 提问者 #1
    意思是await sleep会挂起当前的a1、去执行a2,而不是挂起整段代码?
    2020-05-23 17:19:53
提问者 江民川 2020-05-23 00:45:37

以先输出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做个图解吗?我真的完全没懂。

http://img1.sycdn.imooc.com//climg/5ec801a909fea81009960556.jpg


好帮手慕美 2020-05-22 19:25:14

同学,你好。同学可以根据下述描述来理解三个函数的执行顺序:

 a1() a2() r1()三个依次执行,执行await store.put(i)添加数据,await asyncio.sleep(random.randint(1, 5))随机休息,把执行权交给下一个 a2(),再次执行到await时,会继续把执行权交给r1,从队列中取数据进行输出。休息结束后,执行权重新交回a1(),继续执行代码输出,因此先输出的是reduce语句,此时store中已经有数据了,只是没有执行到输出语句。

如果我的回答解决了您的疑惑。请采纳!祝学习愉快~~~~

  • 提问者 江民川 #1
    没听懂,add()里每句话都用了await,难道不是"暂停",先执行完await后面的代码,再往下执行吗?
    2020-05-23 00:19:14
  • 提问者 江民川 #2
    await到底是,①(暂停当前协程,转而执行await后面的代码,执行完了才会回来执行下面行的代码),还是,②(立马执行await后面的代码,但不等它执行完,就开始执行下面行的代码)?
    2020-05-23 00:23:33
  • 提问者 江民川 #3
    老师,接着看我其他回答。
    2020-05-23 00:25:41
提问者 江民川 2020-05-22 14:12:46

这是视频截图,程序先执行reduce的话,store凭什么size:1

http://img1.sycdn.imooc.com//climg/5ec76d2609aad4e704960248.jpg

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师