day4 使用yield實現單線程
一、yield生成器(yield)
yield用來結束while循環,並且能夠保持之前循環的狀態,下一次調用的時候直接從yield開始執行,執行yield後面的程序,並且重新進行循環;另外,yield還可用來接收參數,接收send()傳遞來的參數,並賦給一個變量。
import time #導入time模塊,用於給生產者生成包子定義時間,比如銀行處理完成之後告訴用戶信息 def consumer(name): #消費者模塊 print("準備吃包子了!....") while True: #循環,死循環,可以使用yield來處理,並且保持在某一個狀態 baozi= yield #使用yield來接收send()傳遞過來的參數,yield與send()結合使用 print("包子[%s]來了,被[%s]吃了!" %(baozi,name)) def producer(name): #定義生成這模型 c = consumer("A") #消費者來買包子 c2 = consumer("B") c.__next__() #調用consumer()函數 c2.__next__() print("老子開始做包子啦!...") for i in range(1,10): time.sleep(1) #生產者每秒鐘做兩個包子 print("做了2個包子!") c.send(i) #把生產者生成的包子傳遞給yield c2.send(i) producer("alex")
上面,我們導入了時間time模塊,time.sleep()讓程序停止一定時間。上面代碼消費者吃包子,生產者生成包子,並且生成了包子之後發給消費者(send())來傳遞,消費者中的yield來接收。這樣就能夠實現,生產者生成包子,並且把包子傳遞給消費者,實現了兩個函數之間的關聯。沒有再次調用函數就實現了兩個函數之間的關聯。
上面程序運行結果如下:
準備吃包子了!....
準備吃包子了!....
老子開始做包子啦!...
做了2個包子!
包子[1]來了,被[A]吃了!
包子[1]來了,被[B]吃了!
做了2個包子!
包子[2]來了,被[A]吃了!
包子[2]來了,被[B]吃了!
做了2個包子!
包子[3]來了,被[A]吃了!
包子[3]來了,被[B]吃了!
做了2個包子!
包子[4]來了,被[A]吃了!
包子[4]來了,被[B]吃了!
做了2個包子!
包子[5]來了,被[A]吃了!
包子[5]來了,被[B]吃了!
做了2個包子!
包子[6]來了,被[A]吃了!
包子[6]來了,被[B]吃了!
做了2個包子!
包子[7]來了,被[A]吃了!
包子[7]來了,被[B]吃了!
做了2個包子!
包子[8]來了,被[A]吃了!
包子[8]來了,被[B]吃了!
做了2個包子!
包子[9]來了,被[A]吃了!
包子[9]來了,被[B]吃了!
import time
#導入time模塊,用於給生產者生成包子定義時間,比如銀行處理完成之後告訴用戶信息
def consumer(name):
#消費者模塊
print("準備吃包子了!....")
while True:
#循環,死循環,可以使用yield來處理,並且保持在某一個狀態
baozi = yield
#使用yield來接收send()傳遞過來的參數,yield與send()結合使用
print("包子[%s]來了,被[%s]吃了!" %(baozi,name))
def producer(name):
#定義生成這模型
c = consumer("A")
#消費者來買包子
c2 = consumer("B")
c.__next__()
#調用consumer()函數
c2.__next__()
print("老子開始做包子啦!...")
for i in range(1,10):
time.sleep(1)
#生產者每秒鐘做兩個包子
print("做了2個包子!")
c.send(i)
#把生產者生成的包子傳遞給yield
c2.send(i)
producer("alex")
day4 使用yield實現單線程