zoukankan      html  css  js  c++  java
  • 协程

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

    协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。

    协程的本质就是一个线程,优势是:没有切换的消耗;没有锁的概念

    • 协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
    • 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

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

    例子:

    #  ------回顾斐波那契数列-----#
    def fab(max):
        a,b = 0,1
        while a<max:
            yield a
            a,b = b,a+b
    for i in fab(20):
        print(i)
    
    
    #------协程-------
    import time
    import queue
    
    def consumer(name):
        print('---->resdy to eat baozi...')
        while True:
            new_baozi = yield
            print('[%s] is eating baozi %s'%(name,new_baozi))
    
    
    def producer():
        r = con.__next__()
        r = con2.__next__()
    
        n=0
        while 1:
    
            time.sleep(1)
            print('producer is making baozi %s and %s'%(n,n-1))
            con.send(n)
            con2.send(n+1)
            n+=2
    
    if __name__=='__main__':
        con = consumer('c1')
        con2 = consumer('c2')
        producer()

    注意到consumer函数是一个generator(生成器),把一个consumer传入produce后:

    1. 首先调用con.next()启动生成器;

    2. 然后,一旦生产了东西,通过con.send(n)切换到consumer执行;

    3. consumer通过yield拿到消息,处理,又通过yield把结果传回;

    4. produce拿到consumer处理的结果,继续生产下一条消息;

    5. produce决定不生产了,通过con.close()关闭consumer,整个过程结束。

    整个流程无锁,由一个线程执行,produce和consumer协作完成任务,所以称为“协程”,而非线程的抢占式多任务。

  • 相关阅读:
    python中特殊参数self的作用
    python中类的初始化案例
    python中类的调用
    Python--网络编程-----struct模块的字节数限制
    Python--网络编程-----解决粘包问题-简单版
    Python--网络编程-----粘包的底层原理分析
    Python--网络编程-----粘包现象
    Python--网络编程-----socket编程示例--模拟ssh远程执行命令
    pycharm下 os.system执行命令返回有中文乱码
    Python--网络编程-----socket编程示例--打电话--加上链接循环
  • 原文地址:https://www.cnblogs.com/xyd134/p/6626597.html
Copyright © 2011-2022 走看看