zoukankan      html  css  js  c++  java
  • 协程-----Coroutine

    协程,又称微线程,纤程。协程是一种用户态的轻量级线程。

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

    协程能实现并发。

    优点:

    • 无需线程上下文切换的开销
    • 无需考虑数据安全问题
    • 方便切换控制留,简化编程模型
    • 高并发,高扩展性,低成本

    缺点:

    • 无法利用多核资源,不能实现并行
    • 只适用I/O操作密集型

    yield 实现协程:

    import time
    
    def consumer():
        while True:
            n =  yield  #创建生成器函数,保存挂起和依据send传值继续该函数
            if not n:
                return
            print('consumer--------consuming %s.....'%n)
            time.sleep(1)
    
    
    def producer(target):
        next(target)      #初始化生成器函数
        n = 0
        while n < 5:
            n += 1
            print('producer--------producing %s.....'%n)
            target.send(n)   #传值
        target.close()
    
    
    if __name__ == '__main__':
        producer(consumer())
        '''producer--------producing 1.....
    consumer--------consuming 1.....
    producer--------producing 2.....
    consumer--------consuming 2.....
    producer--------producing 3.....
    consumer--------consuming 3.....
    producer--------producing 4.....
    consumer--------consuming 4.....
    producer--------producing 5.....
    consumer--------consuming 5.....'''

    greenlet 模块实现协程

    import greenlet
    
    def foo():
        print('ok1')
        g2.switch() #switch 函数切换到g2对象
        print('ok3')
        g2.switch()
    
    def bar():
        print('ok2')
        g1.switch()
        print('ok4')
    
    g1 = greenlet.greenlet(foo)  #创建greenlet 对象,传入需要执行对函数
    g2 = greenlet.greenlet(bar)
    
    if __name__ == '__main__':
        g1.switch()  #启动该函数

    gevent 实现协程

    import gevent,time
    
    def foo():
        print('ok1')
        gevent.sleep(1)
        print('ok3')
    
    def bar():
        print('ok2')
        gevent.sleep(2)    #模拟I/O操作
        print('ok4')
    
    g1 = gevent.spawn(foo)  #创建gevent对象
    g2 = gevent.spawn(bar)
    
    gevent.joinall([g1,g2])  #运行
    '''ok1
    ok2
    ok3
    ok4'''
  • 相关阅读:
    java Class的 getSuperclass与getGenericSuperclass区别
    再有人问你volatile是什么,把这篇文章也发给他
    深入理解乐观锁与悲观锁
    再有人问你Java内存模型是什么,就把这篇文章发给他
    再有人问你synchronized是什么,就把这篇文章发给他
    《成神之路-基础篇》JVM——Java内存模型(已完结)
    css
    css
    require.js
    css -border
  • 原文地址:https://www.cnblogs.com/mona524/p/7212220.html
Copyright © 2011-2022 走看看