zoukankan      html  css  js  c++  java
  • python 协程

    协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程

    协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。

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

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

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

    使用yield实现协程的例子:

    import queue,time
    def consumer(name):
        print('start')
        while True:
            new_baozi=yield     #生成器遇到next 先返回yield后的值,
                                # 如果遇到send(值)把此值赋给new_baozi,第一次若遇到send(值),值只能是None
            print('%s吃%d号包子 '%(name,new_baozi))
    def producer():
        next(con)
        next(con2)
        n=0
        while n<5:
            n+=1
            print('生产%d号包子' % n)
            con.send(n)
            con2.send(n)
    
    if __name__=='__main__':
        con=consumer('c1')  #创建生成器对象
        con2=consumer('c2')
        p=producer()

    符合什么条件就能称之为协程:

    1. 必须在只有一个单线程里实现并发
    2. 修改共享数据不需加锁
    3. 用户程序里自己保存多个控制流的上下文栈
    4. 一个协程遇到IO操作自动切换到其它协程
    写出漂亮的博客就是为了以后看着更方便的。
  • 相关阅读:
    Linux运维笔记
    回到顶部过渡js代码
    好想你红枣
    鼠标点击区域问题
    ie6 hover 子元素无效bug
    IE6和7下text-indent导致inline-block标签消失的bug
    星星评分js代码
    洛谷P3147 [USACO16OPEN]262144 2048 合并 倍增 动归 递推
    洛谷P1114 “非常男女”计划
    洛谷P1108 低价购买 动态规划
  • 原文地址:https://www.cnblogs.com/zhaowei5/p/9337492.html
Copyright © 2011-2022 走看看