Python中协程的实现

时间:2023-03-08 15:42:55
Python中协程的实现

通过关键字yield,可以从生成器中产生值,并返回。我们可以将生成器作为一个生产者来使用。

在协程中,通过使用关键字yield,还可以让具有yield的程序接收值。此时函数作为消费者,消费我们传入(send)的值。

在协程中,可以把yield作为右值来用。在foo函数中,我们这样写:

n = yield

可以通过send方法来向foo函数发送值,这时,发送的值被foo接收,并存到n里。

n中的值可以在foo函数中使用

这样,yield作为右值来使用,就使得foo函数变成了一个消费者。

我们知道,yield关键字用于向调用者返回值。

当作为右值来使用的时候,yield的作用仍然不变,仍然可以向调用者返回值。

当在foo函数中也可以这样写:

n = yield c

这样实际上将foo函数变成了一个能消费我们传给它的值的生成器。

n 的值与c的值无关。如果非要说相关,只是他们出现在了同一行里,对yield有不同的解读罢了。

注意区分:n的值是我们send的值,c的值是保留(hold)的上一步的值。

c的值在什么时候返回呢?只要调用者使用next(),或者之前给c赋过值,现在又走到yield c这里了,那么就返回了。

试着理解下面这段代码:

def countdown(n):
print "Counting down from", n
while n >= 0:
newvalue = (yield n)
# If a new value got sent in, reset n with it
if newvalue is not None:
n = newvalue
else:
n -= 1 c = countdown(5)
for n in c:
print n
if n == 5:
c.send(3)

注意这样一个基本事实,就能知道输出是什么:

for ... in ... 是通过调用next()方法来获取下一个值的,而调用next()方法,相当于send(None)

输出是:

Counting down from 5
5
2
1
0

协程的启动

c.next()

c.send(None)

协程的关闭

c.close()