协程

子程序

子程序(函数)在所有语言中都是层级调用,比如A 调用B,B调用C,C执行完毕返回,B执行完毕返回,最后A执行完。

子程序调用是通过栈实现,一个线程执行一个子程序。

 

协程

看上去也是子程序,执行时,在程序内部可中断(不是函数调用,有点类似于CPU中断),转去执行别的子程序,在适当的时候再返回来接着执行。

协程的特点在于是一个线程执行。

 

协程的优势:

  1极高的执行效率,因为子程序切换不是线程切换,因此没有线程切换的开销。

  2不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好了。

 

协程是一个线程执行,那怎么利用多核CPU?多进程+协程

 

python对协程的支持是通过generator实现的。

在generator中,可以通过调用next()函数获取有yield语句返回的下一个值。

python的yield语句不但可以返回一个值,还可以接收调用者发出的参数。!!

 

Python生成器generator之next和send运行流程

 

生产者-消费者案例:

 

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)
        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

 

 

  

 
posted @ 2017-10-28 10:45  highly  阅读(358)  评论(0编辑  收藏  举报