Skip to content

Latest commit

 

History

History
75 lines (51 loc) · 1.9 KB

13.协程-yield.md

File metadata and controls

75 lines (51 loc) · 1.9 KB

协程

协程,又称微线程,纤程。英文名Coroutine。

一.什么是协程?

协程是python个中另外一种实现多任务的方式 ,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。

通俗的理解

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

二.协程和线程的差异

在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。

操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以 一秒钟切换个上百万次系统都抗的住

三.简单的实现协程

结构:

def 函数名1(参数列表):
    代码1
    yield

def 函数名2(参数列表):
    代码2
    yield

demo:

import time


def fun1():
    while True:
        print("___func1执行了___")
        yield
        time.sleep(0.5)


def func2():
    while True:
        print("___func2执行了___")
        yield
        time.sleep(0.5)


def main():
    f1 = fun1()
    f2 = func2()
    while True:
        next(f1)
        next(f2)


if __name__ == '__main__':
    main()

运行结果:

___func1执行了___
___func2执行了___
___func1执行了___
___func2执行了___
___func1执行了___
....省略....