协程
协程,用户空间的线程,用户自己管理上下文切换,可以免锁访问全局变量,英文名称coroutine。关于协程的理解,大家对不同的语言理解程序不用,所以仁者见仁,智者见智。
python 中的协程
Python对协程的支持是通过generator实现的。
在generator中,我们不但可以通过for循环来迭代,还可以不断调用next()函数获取由yield语句返回的下一个值。
但是Python的yield不但可以返回一个值,它还可以接收调用者发出的参数。
def consumer(): r = '' while True: n = yield r if not n: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None) n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) #send value to generator print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)
执行结果:
[PRODUCER] Producing 1... [CONSUMER] Consuming 1... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 2... [CONSUMER] Consuming 2... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 3... [CONSUMER] Consuming 3... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 4... [CONSUMER] Consuming 4... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 5... [CONSUMER] Consuming 5... [PRODUCER] Consumer return: 200 OK
python 生成器
通过列表可以生成数据,但是会立刻实例化,占用内存空间;生成器则不同,不会立刻生成进入数据循环,可以通过next()使用,或者像列表一样在For中使用,节省内存。
列表推导式使用[],而生成器使用()。
任何有yeild语句的函数,都是生成器。生成器是一种用普通的函数语法定义的迭代器。从yeild语句返回,下一次从yeild之后开始执行。
g=((i+2)*2 for i in range(2,5)) next(g) #g.next()
使用send()方法,可以为生成器提供值。如第一个协程的例子所示。
参考: