协程

协程,用户空间的线程,用户自己管理上下文切换,可以免锁访问全局变量,英文名称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()方法,可以为生成器提供值。如第一个协程的例子所示。

参考:

  1. 协程的好处有哪些?
  2. 进程和线程、协程的区别
  3. python中的协程
  4. 生成器