Python中协程的实现

Posted geeklove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

 





以上是关于Python中协程的实现的主要内容,如果未能解决你的问题,请参考以下文章

谈谈我对 Kotlin 中协程的理解

Lua中协程的使用

Swoole 中协程的使用注意事项及协程中的异常捕获

Unity3D日常开发Unity3D中协程的使用

python中协程

python中协程