Python 中由 yield 實現非同步
阿新 • • 發佈:2019-02-08
yield在python中初學時,覺得比較難理解。yield的作用:
①返回一個值、②接收呼叫者的引數
分析下面的程式碼:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
def consumer():
r = ''
while True:
n = yield r
print("[Consumer] n = %d" %n)
if not n:
return
print("[Consumer] consuming %s..." %n)
r = '200 OK'
def produce(c):
c.send(None)
h = 0
while h < 5:
h = h + 1
print("[Producer] producing %d..." %h)
s = c.send(h)
print("[Producer] consumer return: %s" %s)
c.close()
c = consumer() #建立一個生成器
produce(c) #在該函式中,呼叫生成器的send()方法
結合程式執行過程,可分析出:
第一步:在produce(c)函式中,呼叫了c.send(None)啟動了生成器,遇到yield暫停;接著執行produce()中接下來的程式碼,從執行結果看,確實打印出了[Produce] producing 1 … 當程式執行至c.send(h)時,呼叫生成器並且通過yield傳遞了引數(h = 1)進入consumer()函式執行。
第二步,yield傳遞引數(h=1)給consumer()函式中的n,並接著上一次暫停處往下繼續執行,打印出[Consumer] n = 1,[Consumer] consuming 1… ;在consumer()函式中此時 r 被賦值為’200 OK’,接著迴圈遇到yield, consumer()函式又暫停並且返回變數 r 的值,此時程式又進入produce(c)函式中接著執行。
第三步,produce(c)函式接著第一步中c.send(h)處,繼續往下執行打印出[Producer] consumer return: 200 OK,並進行迴圈,列印[Producer] producing 2… 後,又呼叫c.send(h) 。。。如此迴圈回到第一步!