协程的理解

1.协程是什么?

是一种微线程。协程的特点是在一个线程内执行。

2.为什么要使用协程?

  因为协程有极高的执行效率。

3.为什么协程有极高的执行效率?

   因为协程不是线程切换,只是线程内子程序的控制权的流转。  

4.协程的实现

  • yield实现

yield实现关键在于next和send方法的使用。next是预激,而send方法是控制权流转。

yield有四个状态:

GEN_CREATED:等待开始执行;

GEN_RUNNING:解释器正在执行(只有在多线程应用中才能看到这个状态);

GEN_SUSPENDED:在 yield 表达式处暂停;

GEN_CLOSED:执行结束;

使用inspect.getgeneratorstate()可查看相关状态

使用c.send(10)之后可得到一个返回值,这个返回值为yield右边表达式的值。

import time


def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print("[CONSUMER] Consuming %s..." % n)
        time.sleep(1)
        r = '200 OK'


def produce(c):
    next(c)
    n = 0
    while n < 5:
        n = n+1
        print("[PRODUCE Producing %s ..." % n)
        m = c.send(n)
        print("[PRODUCER] Consuming return: %s" % m)
    c.close()


if __name__ == "__main__":
    c = consumer()
    produce(c)

 结果为:

  • greenlet实现

对于greenlet这个可以参考greenlet的官方文档来加以理解。

from greenlet import greenlet


def test_1():
    print("===1====")
    gr2.switch()
    print("====2===")


def test_2():
    print("===3====")
    gr1.switch()
    print("====4===")


gr1 = greenlet(test_1)
gr2 = greenlet(test_2)
gr1.switch()

 

  • gevent实现
import gevent


def test_a():
    print(12)
    gevent.sleep(1)
    print(34)


def test_b():
    print(56)
    gevent.sleep(2)
    print(78)


gevent.joinall((gevent.spawn(test_a), gevent.spawn(test_b)))

本文参考的博客有:

1.廖雪峰的python课程:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328689835ecd883d910145dfa8227b539725e5ed000

2.greent官方文档:https://greenlet.readthedocs.io/en/latest/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值