08-协程:yield

目标

  • 知道使用 yield 关键字可以实现协程

1. 协程是啥

协程,又称微线程,纤程。英文名Coroutine。从技术的角度来说,“协程就是你可以暂停执行的函数”。如果你把它理解成“就像生成器一样”,那么你就想对了。

线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程(单线程),在一个线程中规定某个代码块执行顺序

image-20180911194831431

协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;

{% em color="#2ff700" %}通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定{% endem %}

2. 协程和线程差异

在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。   所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

3. 简单实现协程

import time


# 创建生成器 work1
def work1():
    """任务1"""
    while True:

        print("正在执行work1------------")
        time.sleep(0.5)
        yield


# 创建生成器 work2
def work2():
    """任务1"""
    while True:

        print("正在执行work2----")
        time.sleep(0.5)
        yield


if __name__ == '__main__':

    # 获取生成器
    w1 = work1()
    w2 = work2()

    while True:
        # 通过生成器获取下一个值
        next(w1)
        next(w2)

运行结果:

正在执行work1------------
正在执行work2----
正在执行work1------------
正在执行work2----
正在执行work1------------
正在执行work2----
正在执行work1------------
正在执行work2----
正在执行work1------------
正在执行work2----
正在执行work1------------
正在执行work2----
...省略...