10.7 【并发编程】从 yield 开始入门协程¶
通过上面的介绍,我们知道生成器为我们引入了暂停函数执行(yield
)的功能。当有了暂停的功能之后,人们就想能不能在生成器暂停的时候向其发送一点东西(其实上面也有提及:send(None)
)。这种向暂停的生成器发送信息的功能通过
PEP 342
进入 Python 2.5
中,并催生了 Python
中协程
的诞生。根据 wikipedia
中的定义
>协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序。
注意从本质上而言,协程并不属于语言中的概念,而是编程模型上的概念。
协程和线程,有相似点
,多个协程之间和线程一样,只会交叉串行执行;也有不同点
,线程之间要频繁进行切换,加锁,解锁,从复杂度和效率来看,和协程相比,这确是一个痛点。协程通过使用
yield
暂停生成器,可以将程序的执行流程交给其他的子程序,从而实现不同子程序的之间的交替执行。
下面通过一个简明的演示来看看,如何向生成器中发送消息。
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
。篇幅也比较多,所以就单独拿出来讲。