day4 生成器並行運算

2022-09-05 19:57:14 字數 2079 閱讀 2503

之前只是介紹生成器,那有些同學就說了,這個生成器除了能節省資源,提高工作效率,但是我們再哪些場景下可以用呢?在哪些地方可以體現出它的價值呢?下面我們來逐一解答這些疑問。

def consumer(name):

print("%s準備發工資啦!"%name)

while true:

gongzi=yield

print("工資%s來了,被%s領了!"%(gongzi,name))

x=consumer("huwei")

x.__next__()

#輸出huwei準備發工資啦!

我們再加幾個__next__()方法:

def consumer(name): 

print("%s準備發工資啦!"%name)

while true:

gongzi=yield

print("工資%s來了,被%s領了!"%(gongzi,name))

x=consumer("huwei")

x.__next__()

x.__next__()

b="1個億"

x.send(b)

x.__next__()

#輸出huwei準備發工資啦!

工資none來了,被huwei領了!

工資1個億來了,被huwei領了!

工資none來了,被huwei領了!

# next()只是在呼叫(喚醒)yield,但是不會給其傳值,而send除了能夠呼叫(喚醒)同時還能給其傳值

第乙個例子沒有執行print("工資%s來了,被%s領了!"%(gongzi,name)),接著我們來除錯一下,看看具體過程:

...........................debug

我們把"優化"發工資的再規範一下,可以使用

#-*-coding:utf-8-*-

importtime

def consumer(name): #0

print("%s準備發工資啦!"%name) #4

whiletrue:

gongzi=yield #5

print("工資%s來了,被%s領了!"%(gongzi,name)) #9

defproducer(name):

x=consumer("a") #1 只是將consumer()變成乙個生成器

x1=consumer("b") #2 只是將consumer()變成乙個生成器

x.__next__() #3

x1.__next__() #6

print("財務開始做工資啦!") #7

for i in range(10):

time.sleep(2)

print("做了2個人的工資!")

x.send(i) #8

x1.send(i) #10

producer("dick")

#輸出a準備發工資啦!

b準備發工資啦!

財務開始做工資啦!

做了2個人的工資!

工資0來了,被a領了!

工資0來了,被b領了!

做了2個人的工資!

工資1來了,被a領了!

工資1來了,被b領了!

做了2個人的工資!

工資2來了,被a領了!

工資2來了,被b領了!

解析:在#1和#2只是將consumer()函式變成生成器(如果# 0 consumer是函式的話,我們執行consumer()就會直接列印),在這裡#0是生成器,而我們第一次呼叫#3目的是要其列印#4,我們執行#3時,程式consumer才會繼續往下執行,執行到#5處 自動中斷返回,返回到#6,再從#6呼叫程式consumer會繼續往下執行,執行到#5處 自動中斷返回到#7繼續向下執行,當執行到#8時將#8 i 的值賦值給yield,繼續向下#9執行,執行後由於是while迴圈,又繼續回到#5跳出返回到#10,接著#10又send i 賦值給#5,如此執行,直到結束

注意:實現單執行緒下的並行處理,雖然它仍然是序列依次處理,但是我們可以在不同的角色之間來回地切換,並且執行速度特別快,感覺上是並行的。注意,這個就是非同步i/o的雛形。

小白的Python之路 day4 生成器並行運算

我們已經明白生成器內部的結構,其實就是通過像函式這樣的東西實現的!多執行緒和單執行緒 簡單來說多執行緒就是並行運算,單執行緒就是序列運算 第一步 生成乙個生成器 第二步 執行第乙個next方法,開始呼叫函式,執行到yield時中斷,把返回值返回給變數 moon cake 下面有next有幾次執行幾次...

day19 生成器函式

語法上和函式類似 生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值。自動實現迭代器協議 對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中,如for迴圈,sum函式 由於生成器自動...

day19 生成器函式

語法上和函式類似 生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值。自動實現迭代器協議 對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中,如for迴圈,sum函式 由於生成器自動...