1. 程式人生 > >day4 使用yield實現單線程

day4 使用yield實現單線程

produce 實現 定義 並且 傳遞 -s 老子 mil 接收

一、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()傳遞過來的參數,yieldsend()結合使用
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實現單線程