Python中協程的實現
阿新 • • 發佈:2018-01-01
實現 生成 div ext 保留 不同的 不變 理解 我們 可以向調用者返回值。
通過關鍵字yield,可以從生成器中產生值,並返回。我們可以將生成器作為一個生產者來使用。
在協程中,通過使用關鍵字yield,還可以讓具有yield的程序接收值。此時函數作為消費者,消費我們傳入(send)的值。
在協程中,可以把yield作為右值來用。在foo函數中,我們這樣寫:
n = yield
可以通過send方法來向foo函數發送值,這時,發送的值被foo接收,並存到n裏。
n中的值可以在foo函數中使用
這樣,yield作為右值來使用,就使得foo函數變成了一個消費者。
我們知道,yield關鍵字用於向調用者返回值。
當作為右值來使用的時候,yield的作用仍然不變,仍然
當在foo函數中也可以這樣寫:
n = yield c
這樣實際上將foo函數變成了一個能消費我們傳給它的值的生成器。
n 的值與c的值無關。如果非要說相關,只是他們出現在了同一行裏,對yield有不同的解讀罷了。
註意區分:n的值是我們send的值,c的值是保留(hold)的上一步的值。
c的值在什麽時候返回呢?只要調用者使用next(),或者之前給c賦過值,現在又走到yield c這裏了,那麽就返回了。
試著理解下面這段代碼:
def countdown(n): print "Counting down from", n while n >= 0: newvalue= (yield n) # If a new value got sent in, reset n with it if newvalue is not None: n = newvalue else: n -= 1 c = countdown(5) for n in c: print n if n == 5: c.send(3)
註意這樣一個基本事實,就能知道輸出是什麽:
for ... in ... 是通過調用next()方法來獲取下一個值的,而調用next()方法,相當於send(None)
輸出是:
Counting down from 5
5
2
1
0
協程的啟動:
c.next()
c.send(None)
協程的關閉:
c.close()
Python中協程的實現