zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    CentOS 7基于Containerd部署Kubernetes v1.20.5
    【k8s记录】二进制安装kubernetes高可用集群全过程完整版v1.20
    前台后台$.psot交互
    $.ajax与$.post、$.get的一点区别
    layui与jQuery一起使用
    用Emmet写前端代码
    栅格布局的实现过程,容器到列的划分
    bootstrap环境
    2个爬虫
    think PHP5中,模板、控制器、JavaScript的url跳转重定向方法
  • 原文地址:https://www.cnblogs.com/geeklove01/p/8159393.html
Copyright © 2011-2022 走看看