zoukankan      html  css  js  c++  java
  • python协程实现

    参考:

    https://www.cnblogs.com/zhangxinqi/p/8337207.html

    https://www.cnblogs.com/xybaby/p/6337944.html

    协程的概念

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

    协程是程序级别的,由程序自己决定如何调度。

    协程的概念:

    在子程序执行过程中可以中断去执行别的子程序,而别的子程序也可以中断回来继续执行之前的子程序,这个过程就称为协程。
    
    类似与yield操作。
    

    协程的优点:

    1. 无需线程切换上下文,避免了无意义的调度。可以提高程序性能。
    2. 无需原子操作锁定及同步的开销
    3. 方便切换控制流,简化编程模型
    4. 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

    协程的缺点:

    1. 无法利用多核资源。
    2. 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序

    Python3协程的实现

    1. 用yield实现:
    
    def consumer(name):
        count = 12
        print('开始吃包子...')
        # while True:
        bone = 0
        while bone <= count:
            print('%s需要包子' % name)
            bone = yield  # 接收send发送的数据
            print('%s吃了%s个包子' % (name, bone))
    
    
    def producer(obj1):
        obj1.send(None)  # 必须先发送None,触发协程运行
        for i in range(3):
            print('[producer]正在做%s个包子' % i)
            obj1.send(i)
    
    
    if __name__ == '__main__':
        con1 = consumer('消费者A')  # 创建消费者对象, 此时程序并未执行,只是返回了一个生成器对象。
    
        producer(con1)
    
        print("协程结束")
    
    1. greenlet模块实现程序间切换执行
    from greenlet import greenlet
    def test1():
        print 12
        gr2.switch()
        print 34
    
    def test2():
        print 56
        gr1.switch()
        print 78
    
    gr1 = greenlet(test1)
    gr2 = greenlet(test2)
    gr1.switch()
    
    # 输出为:
    #     12 56 34
    
    1. gevent框架
  • 相关阅读:
    函数名的应用/列表推导式
    装饰器/内置函数
    函数的基础
    文件的改的操作
    常用str
    python 定时器 timer QTimer
    Python 2.7.16 pyinstaller3.0 生成exe可执行文件
    python 根据excel单元格内容获取该单元格所在的行号
    python 实现仪器LAN口通信(FLUKE 8846)
    VS2019 MSB8041 MSB8042 Error
  • 原文地址:https://www.cnblogs.com/dream2sky/p/14233202.html
Copyright © 2011-2022 走看看