因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程。正如Knuth所说:“子例程是协程的特例。”因为子例程只返回一次,要返回多个值就要通过集合的形式。这在有些语言,如Forth里很方便;而其他语言,如C,只允许单一的返回值,所以就需要引用一个集合。相反地,因为协程可以返回多次,返回多个值只需要在后继的协程调用中返回附加的值即可。在后继调用中返回附加值的协程常被称为产生器。有些情况下,使用协程的实现策略显得很自然,但是此环境下却不能使用协程。典型的解决方法是创建一个子例程,它用布尔标志的集合以及其他状态变量在调用之间维护内部状态。代码中基于这些状态变量的值的条件语句产生出不同的执行路径及后继的函数调用。另一种典型的解决方案是用一个庞大而复杂的switch语句实现一个显式状态机。这种实现理解和维护起来都很困难。
生成器和普通函数有些区别,比如生成器不用return返回,而用yield来返回一系列元素
除非“召唤”生成器的next(),否则函数体里面不会执行任何代码块,上下文环境保存着。
虽然不需要明确定义__iter__()和next()方法,但是它本身包含这个方法。
当想要结束一个协程时,使用close()方法即可,close会在协程中引发GeneratorExit异常,这时候可以通过try/except捕获。
def consumer(): try: while True: food = yield if not food: return print ‘Consume Food: ‘, food except GeneratorExit: print ‘====== over ======‘ finally: return def producer(): c1 = consumer() c1.send( None ) food = {} for count in xrange( 5 ): item = chr( count + 65 ) food[item] = count print ‘Produce food: ‘, food c1.send( food ) c1.close() return producer()
生产者消费者 协同程序 python
时间: 2024-11-03 03:39:34