zoukankan      html  css  js  c++  java
  • 协程

    协程

    协程,又称微线程,纤程。英文名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机制))

  • 相关阅读:
    Java List集合
    Java 集合删除重复元素、删除指定元素
    进程和线程
    Java 线程的同步与死锁
    Java 线程的常用操作方法
    Java 多线程实现
    统计分析
    递归方法(回文)
    素数的输出
    动手动脑二
  • 原文地址:https://www.cnblogs.com/zx125/p/11449540.html
Copyright © 2011-2022 走看看