2012-08-06 82 views
4

的行爲,我瞭解協程,但它的工作奇怪的是,我無法理解...... 這裏的源奇怪協程

@coroutine 
def printer(): 
    tmp=(yield) 
    print tmp 

def sender(coru): 
    coru.send("hello") 
    print "I'm sender" 

if __name__=="__main__": 
    coru=printer() 
    sender(coru) 
    print "I'm master" 

顯示

你好

StopItertationError (「hello」)

while,

@coroutine 
def printer(): 
      while 1: 
       tmp=(yield) 
       print tmp 

def sender(coru): 
    coru.send("hello") 
    print "I'm sender" 

if __name__=="__main__": 
    coru=printer() 
    sender(coru) 
    print "I'm master" 

顯示

你好

我發送

我主

正確。

所以我不知道

  1. 爲何總是協程與環工作,爲什麼第一個例子上升錯誤

  2. 我heared關於「收益率從」語法在3.3版本。這是否有助於使第一個工作?

  3. 我知道每個協程函數的工作原理與子程序不同。

    但是,我認爲,在打印機功能結束後,程序應該終止而不返回發件人。

    但它確實。這是否意味着發件人優於打印機?子程序和協程之間有什麼區別呢。

感謝您的閱讀,我真的很感激,如果你ENLIGHT我:)

+0

。這只是將func.next()自動化以使協程準備就緒的包裝器 – 2012-08-06 08:44:52

回答

5

當發電機(如printer)結束時,它拋出一個StopIteration異常。

當Python執行

coru.send("hello") 

它跳到

tmp = (yield) 

,並指定 「你好」 tmp。然後執行下一行:

print tmp 

,然後生成結束,從而提高了StopIteration例外。

另一方面,如果您不允許printer結束(通過使用while 1循環),則絕不會引發StopIteration異常。代替執行(在printer)繼續進行,直到達到下一個yield表達式:

tmp = (yield) 

send該方法返回yield表達式的值(在這種情況下,None)。在這一點上,Python已經再次回到了sender功能和未來執行

print "I'm sender" 

yield from語法的目的是爲了更容易重構發電機(旨在與sendthrow使用)成子發生器。 See PEP380What's New in Python3

它不會更改StopIteration行爲。

+0

謝謝!這真的很有幫助 – 2012-08-06 13:56:09