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/