🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 10.7 【并发编程】从 yield 开始入门协程 通过上面的介绍,我们知道生成器为我们引入了暂停函数执行(`yield`)的功能。当有了暂停的功能之后,人们就想能不能在生成器暂停的时候向其发送一点东西(其实上面也有提及:`send(None)`)。这种向暂停的生成器发送信息的功能通过 `PEP 342` 进入 `Python 2.5` 中,并催生了 `Python` 中`协程`的诞生。根据 `wikipedia` 中的定义 >协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序。 注意从本质上而言,协程并不属于语言中的概念,而是编程模型上的概念。 协程和线程,有`相似点`,多个协程之间和线程一样,只会交叉串行执行;也有`不同点`,线程之间要频繁进行切换,加锁,解锁,从复杂度和效率来看,和协程相比,这确是一个痛点。协程通过使用 `yield` 暂停生成器,可以将程序的执行流程交给其他的子程序,从而实现不同子程序的之间的交替执行。 下面通过一个简明的演示来看看,如何向生成器中发送消息。 ```python def jumping_range(N): index = 0 while index < N: # 通过send()发送的信息将赋值给jump jump = yield index if jump is None: jump = 1 index += jump if __name__ == '__main__': itr = jumping_range(5) print(next(itr)) print(itr.send(2)) print(next(itr)) print(itr.send(-1)) ``` 输出。 ``` 0 2 3 2 ``` 这里解释下为什么这么输出。 重点是`jump = yield index`这个语句。 分成两部分: - `yield index` 是将index `return`给外部调用程序。 - `jump = yield` 可以接收外部程序通过send()发送的信息,并赋值给`jump` 以上这些,都是讲协程并发的**基础必备知识**,**请一定要亲自去实践并理解它**,不然后面的内容,将会变得枯燥无味,晦涩难懂。 下一章,我将讲一个Python3.5新引入的语法:`yield from`。篇幅也比较多,所以就单独拿出来讲。