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框架
posted @ 2021-01-04 23:45  petrel1572  阅读(81)  评论(0编辑  收藏  举报