day4-生成器并行运算
一、概述
之前只是介紹生成器,那有些同學(xué)就說了,這個生成器除了能節(jié)省資源,提高工作效率,但是我們再哪些場景下可以用呢?在哪些地方可以體現(xiàn)出它的價值呢?下面我們來逐一解答這些疑問。
二、生成器執(zhí)行原理
1、執(zhí)行原理
def consumer(name):print("%s 準(zhǔn)備吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]來了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao") c.__next__()#輸出 zhangqigao 準(zhǔn)備吃包子啦!?如果我再加一個__next__()方法會有什么效果?
def consumer(name):print("%s 準(zhǔn)備吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]來了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao") c.__next__() c.__next__()#輸出 zhangqigao 準(zhǔn)備吃包子啦! 包子[None]來了,被[zhangqigao]吃了?很明顯,第一種情況沒有執(zhí)行"print("包子[%s]來了,被[%s]吃了"%(baozi,name))",這段代碼,接下來我們就來調(diào)試一下。
2、調(diào)試
第一步:生成一個生成器
第二步:執(zhí)行第一個__next__()方法進(jìn)入函數(shù),執(zhí)行到y(tǒng)ield時中斷,把返回值返回給baozi這個變量:
第三步:開始執(zhí)行下面的程序,也就執(zhí)行到了第二個__next__()方法,直接跳轉(zhuǎn)到y(tǒng)ield這邊,繼續(xù)上一次的中斷往下執(zhí)行,這樣就執(zhí)行了yield下面的程序,當(dāng)再次執(zhí)行到y(tǒng)ield關(guān)鍵字時,則繼續(xù)中斷,并且把返回值賦給baozi關(guān)鍵字,如果下面沒有其他程序,則程序結(jié)束。
?
小結(jié):
三、send()和__next__()方法的區(qū)別
1、send()方法
def consumer(name):print("%s 準(zhǔn)備吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]來了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao") c.__next__() #不使用__next__()方法會報錯 b1 = "肉松餡" c.send(b1) #調(diào)用yield,同時給yield傳一個值 b2 = "韭菜餡" c.send(b2)#輸出 zhangqigao 準(zhǔn)備吃包子啦! 包子[肉松餡]來了,被[zhangqigao]吃了 包子[韭菜餡]來了,被[zhangqigao]吃了?從上面可以看出send()和__next__()方法的區(qū)別:
為什么給消費(fèi)者傳值時,必須先執(zhí)行__next__()方法?
因為如果不執(zhí)行一個__next__()方法,只是把函數(shù)變成一個生成器,你只有__next__()一下,才能走到第一個yield,然后就返回了,調(diào)用下一個send()傳值時,才會發(fā)包子。
四、yield實(shí)現(xiàn)并行效果
yield還有一個更強(qiáng)大的功能,就是:單線程實(shí)現(xiàn)并發(fā)效果。
import timedef consumer(name):print("%s 準(zhǔn)備吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]來了,被[%s]吃了"%(baozi,name))def producer(name):c = consumer("A")c2 = consumer("B")c.__next__()c2.__next__()print("老子準(zhǔn)備吃包子啦!")for i in range(10):time.sleep(1)print("做了一個包子,分兩半")c.send(i)c2.send(i)producer("zhangqigao")?這個是生產(chǎn)者消費(fèi)者模式,這個也就是后面協(xié)程的效果,這個我們后續(xù)再講,先了解一下,生成器可以實(shí)現(xiàn)并發(fā)效果,極大的提高程序的運(yùn)行效率。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhangqigao/articles/6621910.html
總結(jié)
以上是生活随笔為你收集整理的day4-生成器并行运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络基础知识及计算机基础,OSI7层
- 下一篇: arping 帮助——翻译