• 协程-----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'''
  • 相关阅读:
    又来项目了,星座运势widget
    ubuntu下编译android源代码
    Android UI,界面辅助设置工具,可随意拖动控件,比google官方提供的方便
    Android 1.5原生软件开发SDK公布
    REST转自WIKI
    Android SDK 1.5 包装索引
    android google market FreshFace上线了,大家都试用试用,反正免费的
    JSON
    ubuntu命令
    网站支付宝接口错误代码:TRADE_DATA_MATCH_ERROR怎么处理? uz
  • 原文地址:https://www.cnblogs.com/mona524/p/7212220.html
Copyright © 2020-2023  润新知