2016-12-02 53 views
0

我很久以前就聽說過有關聯合程序的問題,但從來沒有使用它們。據我所知,協同例程與發電機相似。爲什麼我們需要python中的協程?

爲什麼我們需要Python中的協同例程?

+0

你應該能夠找到一個答案,使用谷歌。這裏的任何答案都可能是主觀和冗長的。這就是爲什麼這樣的問題被認爲是SO的主題。 –

+0

我同意。我想獲得一個可以使用它的真實例子。 – Rainmaker

+2

我認爲David Beasley(dabeaz)是Python中協程的主要支持者之一。他的博客或pycon會談可能是一個開始的好地方。 –

回答

1

Generator使用yield來返回值。 Python生成器函數也可以使用(yield)語句使用值。另外有兩個關於生成器對象的新方法,send()close(),爲消耗和生成值的對象創建一個框架。定義這些對象的生成器函數稱爲coroutines

協程消耗使用(yield)語句值如下:

value = (yield) 

有了這個語法,執行在此聲明將暫停,直到對象的發送方法與一個參數調用:

coroutine.send(data) 

然後,執行恢復,並賦值給數據值。爲了表示計算結束,我們使用close()方法關閉協程。這會在協程中引發一個GeneratorExit異常,我們可以用try/except子句來捕捉異常。

下面的例子說明了這些概念。這是一個協同打印匹配提供的模式的字符串。

def match(pattern): 
    print('Looking for ' + pattern) 
    try: 
     while True: 
      s = (yield) 
      if pattern in s: 
       print(s) 
    except GeneratorExit: 
     print("=== Done ===") 

我們用一個模式初始化,並調用__next__()開始執行:

m = match("Jabberwock") 
m.__next__() 
Looking for Jabberwock 

__next__()的調用導致函數體被執行,所以行「尋找jabberwock」打印出來。執行繼續,直到遇到語句line = (yield)。然後,執行暫停,並等待一個值發送給m。我們可以使用send()將值發送給它。