2012-08-06 56 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