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协作完成任务,所以称为“协程”,而非线程的抢占式多任务。

  • 相关阅读:
    LeetCode Array Easy 414. Third Maximum Number
    LeetCode Linked List Medium 2. Add Two Numbers
    LeetCode Array Easy 283. Move Zeroes
    LeetCode Array Easy 268. Missing Number
    LeetCode Array Easy 219. Contains Duplicate II
    LeetCode Array Easy 217. Contains Duplicate
    LeetCode Array Easy 189. Rotate Array
    LeetCode Array Easy169. Majority Element
    LeetCode Array Medium 11. Container With Most Water
    LeetCode Array Easy 167. Two Sum II
  • 原文地址:https://www.cnblogs.com/xyd134/p/6626597.html
Copyright © 2011-2022 走看看