协程,又称微线程,纤程。英文名 Coroutine。
协程是 Python 中另外一种实现多任务的方式,只不过比线程更小,占用更小执行单元(理解为需要的资源)。
为啥说它是一个执行单元,因为它自带 CPU 上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。
通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。
协程和线程差异
在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。
操作系统为了程序运行的高效性每个线程都有自己缓存 Cache 等等数据,操作系统还会帮你做这些数据的恢复操作,所以线程的切换非常耗性能。
但是协程的切换只是单纯的操作 CPU 的上下文,所以一秒钟切换个上百万次系统都抗得住。
之前我们讲过 yield 关键字,现在就用它来实现多任务。
例子:
import time
def task_1():
while True:
print("--1--")
time.sleep(0.5)
yield
def task_2():
while True:
print("--2--")
time.sleep(0.5)
yield
def main():
t1 = task_1()
t2 = task_2()
while True:
next(t1)
next(t2)
if __name__ == "__main__":
main()
运行过程:
先让 t1 运行一会,当 t1 遇到 yield 的时候,再返回到 main() 循环的地方,然后执行 t2 , 当它遇到 yield 的时候,再次切换到 t1 中,这样 t1 和 t2 就交替运行,最终实现了多任务,协程。
运行结果:
greenlet
为了更好使用协程来完成多任务,Python 中的 greenlet 模块对其封装,从而使得切换任务变的更加简单。
首先你要安装一下 greenlet 模块。
pip3 install greenlet
from greenlet import greenlet
import time
def <