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操作自动切换到其它协程
    写出漂亮的博客就是为了以后看着更方便的。
  • 相关阅读:
    Best Time to Buy and Sell Stock
    Remove Nth Node From End of List
    Unique Paths
    Swap Nodes in Pairs
    Convert Sorted Array to Binary Search Tree
    Populating Next Right Pointers in Each Node
    Maximum Subarray
    Climbing Stairs
    Unique Binary Search Trees
    Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/zhaowei5/p/9337492.html
Copyright © 2011-2022 走看看