1. 程式人生 > >Python中協程的實現

Python中協程的實現

實現 生成 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中協程的實現