采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
如题 老师写的代码中并没有终止middle函数中的while Ture ,但是运行程序并没有被while Ture卡住,那么是如何做到让middle函数停止的呢?
我看到老师关于这个回答了 但是 是middle里的while true 不是sales_sum里的while true
middle中调用了yield from这个就是说这里面在子协程中和调用方之间直接建立了通道 所以sales_sum中return之后 middle也就return了 也就跳出了while循环
还有一个问题: 我把middle函数中的whlie ture给去掉了 然后运行代码,抛出stopiteration 不是说yield from可以捕获stopiteration吗??? 问题: 为什么要在middle函数里写while true
yield from处理的是sales_num中的stopiteration 而不是处理父协程的stop这个我在yield from的原理中讲解过
你能贴一下代码吗?
final_result = {} def middle(key): while True: final_result[key] = yield from sales_sum(key) print(key+"销量统计完成!!.") def sales_sum(pro_name): total = 0 nums = [] while True: x = yield print(pro_name+"销量: ", x) if not x: break total += x nums.append(x) return total, nums def main(): data_sets = { "bobby牌面膜": [1200, 1500, 3000], "bobby牌手机": [28,55,98,108 ], "bobby牌大衣": [280,560,778,70], } for key, data_set in data_sets.items(): print("start key:", key) m = middle(key) m.send(None) # 预激middle协程 for value in data_set: m.send(value) # 给协程传递每一组的值 m.send(None) print("final_result:", final_result) if __name__ == '__main__': main() ---------------------------------------------------------------- 代码是12-9yield from example的代码 老师在视频里讲了子生成器函数sales_sum的退出 不知道委托生成器函数的middle的while true什么时候退出???
m.send(None)使得sales_num生成器执行结束了, middle执行完print了, while True会让程序继续从yield from这一行开始执行,则此时又进入到yield from sales_num中, 到 x = yield这一步暂停, 因为m.send(None)是从上一个暂停的地方执行到下一个yield语句暂停,然后因为main中的for进入下一层循环了,m对象又被重新赋值了, 所以之前的状态都消失了, while True没有退出过,只是生成器重新初始化了而已
登录后可查看更多问答,登录/注册
socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO
1.2k 31
1.1k 24
1.1k 16
1.4k 10
1.1k 9