python 生成器協(xié)程運(yùn)算實(shí)例
一、yield運(yùn)行方式
我們定義一個(gè)如下的生成器:
def put_on(name):
print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name))
p = put_on("bigberg")
#輸出
G:\python\install\python.exe G:/python/untitled/study4/test/double.py
Process finished with exit code 0
當(dāng)我們把一個(gè)函數(shù)通過(guò)yield轉(zhuǎn)換成生成器,直接運(yùn)行函數(shù)是不會(huì)出現(xiàn)結(jié)果返回的。因?yàn)榇藭r(shí)函數(shù)已經(jīng)是個(gè)生成器了,我們要通過(guò)next()來(lái)取得值,并且在遇到y(tǒng)ield時(shí)再次跳出函數(shù)。
print(type(p)) #輸出 <class 'generator'>
我們添加next()方法:
def put_on(name):
print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name))
while True:
goods = yield #遇到y(tǒng)ield中斷
print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name)) #中斷后運(yùn)行部分
p = put_on("bigberg")
p.__next__()
#輸出
Hi bigberg, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!
此時(shí)函數(shù)中斷在 goods = yield 的地方,當(dāng)我們?cè)俅握{(diào)用next()函數(shù)時(shí),函數(shù)只會(huì)運(yùn)行中斷以后的內(nèi)容,即上例中的yield下面部分。
我們?cè)偬砑右粋€(gè)next():
def put_on(name):
print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name))
p = put_on("bigberg")
p.__next__()
p.__next__()
#輸出
Hi bigberg, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!
貨物[None]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
我們可以第二次next()運(yùn)行的是yield下面的部分內(nèi)容,但是并沒(méi)有給goods傳值,所以貨物是 None。
小結(jié):
通過(guò)yield將函數(shù)轉(zhuǎn)換為生成器,需要使用next()方法才能運(yùn)行
yield只是保留函數(shù)的中斷狀態(tài),再次調(diào)用next()會(huì)執(zhí)行yield后面的部分
yield如果沒(méi)有返回值,會(huì)返回一個(gè)None空值
二、send()傳值
def put_on(name):
print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name))
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
#輸出
Hi bigberg, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!
貨物[瓜子]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
小結(jié):
__next__()只是調(diào)用這個(gè)yield,也可以說(shuō)成是喚醒yield,但是不不會(huì)給yield傳值。
send()方法調(diào)用yield是,能給yield傳值
使用send()函數(shù)之前必須使用__next__(),因?yàn)橄纫袛?,?dāng)?shù)诙握{(diào)用時(shí),才可傳值。
def put_on(name):
print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name))
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
p.send("花生")
p.send("餅干")
p.send("牛奶")
#多次調(diào)用send()
Hi bigberg, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!
貨物[瓜子]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
貨物[花生]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
貨物[餅干]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
貨物[牛奶]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
三、單線程實(shí)現(xiàn)并行效果(協(xié)程)
import time
def put_on(name):
print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name))
def transfer(name):
p = put_on('A')
p2 = put_on('B')
p.__next__()
p2.__next__()
print("%s將貨物送來(lái)了!"%name)
for i in range(5):
time.sleep(1)
print("%s遞過(guò)來(lái)兩件貨物"%name)
p.send("瓜子")
p2.send("花生")
transfer("bigberg")
#輸出
Hi A, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!
Hi B, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!
bigberg將貨物送來(lái)了!
bigberg遞過(guò)來(lái)兩件貨物
貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。
貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。
bigberg遞過(guò)來(lái)兩件貨物
貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。
貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。
bigberg遞過(guò)來(lái)兩件貨物
貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。
貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。
bigberg遞過(guò)來(lái)兩件貨物
貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。
貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。
bigberg遞過(guò)來(lái)兩件貨物
貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。
貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。
以上這篇python 生成器協(xié)程運(yùn)算實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch教程resnet.py的實(shí)現(xiàn)文件源碼分析
torchvision.models這個(gè)包中包含alexnet、densenet、inception、resnet、squeezenet、vgg等常用的網(wǎng)絡(luò)結(jié)構(gòu),并且提供了預(yù)訓(xùn)練模型,可以通過(guò)簡(jiǎn)單調(diào)用來(lái)讀取網(wǎng)絡(luò)結(jié)構(gòu)和預(yù)訓(xùn)練模型2021-09-09
在Python中使用mongoengine操作MongoDB教程
這篇文章主要介紹了在Python中使用mongoengine操作MongoDB教程,包括在Django下的一些使用技巧,需要的朋友可以參考下2015-04-04
pandas數(shù)據(jù)探索之合并數(shù)據(jù)示例詳解
這篇文章主要為大家介紹了pandas數(shù)據(jù)探索之合并數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
python統(tǒng)計(jì)字符的個(gè)數(shù)代碼實(shí)例
在本篇文章里小編給大家整理了關(guān)于python統(tǒng)計(jì)字符的個(gè)數(shù)代碼實(shí)例內(nèi)容,需要的朋友們可以參考下。2020-02-02
python項(xiàng)目導(dǎo)入open3d后報(bào)錯(cuò)ImportError:DLL load failed:找不到
這篇文章主要介紹了python項(xiàng)目導(dǎo)入open3d后報(bào)錯(cuò)ImportError:DLL load failed:找不到指定的模塊問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Python結(jié)合Sprak實(shí)現(xiàn)計(jì)算曲線與X軸上方的面積
這篇文章主要介紹了Python結(jié)合Sprak實(shí)現(xiàn)計(jì)算曲線與X軸上方的面積,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02
詳解如何使用python創(chuàng)建和結(jié)束線程
線程的創(chuàng)建和結(jié)束是多線程編程中的核心概念之一,在本文中,我們將學(xué)習(xí)如何使用 Python 創(chuàng)建線程,并探討如何優(yōu)雅地結(jié)束線程,需要的朋友可以參考下2024-04-04

