协程

协程

协程,又称微线程,纤程。英文名Coroutine。

优点1: 协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

优点2: 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

使用 生成器实现一个简单的协程过程

import time

def customer(name):
    while 1:
        bao_zi=yield
        print(f"{name}吃{bao_zi}")

def producer():
    v=1
    c1.__next__()
    c2.__next__()
    while 1:
        bao_zi =f"baozi{v}"
        bao_zi2=f"baozi{v+1}"
        print("包子出炉了")
        time.sleep(1)
        c1.send(bao_zi)
        c2.send(bao_zi2)
        v+=2

if __name__ == '__main__':
    c1=customer("c1")
    c2=customer("c2")
    producer()

包子出炉了
c1吃baozi1
c2吃baozi2
包子出炉了
c1吃baozi3
c2吃baozi4
包子出炉了
c1吃baozi5
c2吃baozi6
包子出炉了
c1吃baozi7
c2吃baozi8
包子出炉了
c1吃baozi9
c2吃baozi10

协程的优点

优点如下:

1.协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级

2.单线程内就可以实现并发的效果,最大限度地利用cpu

缺点如下:

1.协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程

2.协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程

总结协程特点:

1.必须在只有一个单线程里实现并发

2.修改共享数据不需加锁

3.用户程序里自己保存多个控制流的上下文栈

4.附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield、greenlet都无法实现,就用到了gevent模块(select机制))

posted @ 2019-09-02 22:44  zx125  阅读(326)  评论(0编辑  收藏  举报