zoukankan      html  css  js  c++  java
  • day4 使用yield实现单线程

    一、yield生成器(yield)

        yield用来结束while循环,并且能够保持之前循环的状态,下一次调用的时候直接从yield开始执行,执行yield后面的程序,并且重新进行循环;另外,yield还可用来接收参数,接收send()传递来的参数,并赋给一个变量。

    import time
    #导入time模块,用于给生产者生成包子定义时间,比如银行处理完成之后告诉用户信息
    def consumer(name):
        #消费者模块
        print("准备吃包子了!....")
        while True:
            #循环,死循环,可以使用yield来处理,并且保持在某一个状态
            baozi = yield
            #使用yield来接收send()传递过来的参数,yield与send()结合使用
            print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
    
    def producer(name):
        #定义生成这模型
        c = consumer("A")
        #消费者来买包子
        c2 = consumer("B")
        c.__next__()
        #调用consumer()函数
        c2.__next__()
        print("老子开始做包子啦!...")
        for i in range(1,10):
            time.sleep(1)
            #生产者每秒钟做两个包子
            print("做了2个包子!")
            c.send(i)
            #把生产者生成的包子传递给yield
            c2.send(i)
    
    producer("alex")

        上面,我们导入了时间time模块,time.sleep()让程序停止一定时间。上面代码消费者吃包子,生产者生成包子,并且生成了包子之后发给消费者(send())来传递,消费者中的yield来接收。这样就能够实现,生产者生成包子,并且把包子传递给消费者,实现了两个函数之间的关联。没有再次调用函数就实现了两个函数之间的关联。

        上面程序运行结果如下:

        准备吃包子了!....
      准备吃包子了!....
      老子开始做包子啦!...
      做了2个包子!
      包子[1]来了,被[A]吃了!
      包子[1]来了,被[B]吃了!
      做了2个包子!
      包子[2]来了,被[A]吃了!
      包子[2]来了,被[B]吃了!
      做了2个包子!
      包子[3]来了,被[A]吃了!
      包子[3]来了,被[B]吃了!
      做了2个包子!
      包子[4]来了,被[A]吃了!
      包子[4]来了,被[B]吃了!
      做了2个包子!
      包子[5]来了,被[A]吃了!
      包子[5]来了,被[B]吃了!
      做了2个包子!
      包子[6]来了,被[A]吃了!
      包子[6]来了,被[B]吃了!
      做了2个包子!
      包子[7]来了,被[A]吃了!
      包子[7]来了,被[B]吃了!
      做了2个包子!
      包子[8]来了,被[A]吃了!
      包子[8]来了,被[B]吃了!
      做了2个包子!
      包子[9]来了,被[A]吃了!
      包子[9]来了,被[B]吃了!

        我们在使用while循环的时候,可以使用yield终止循环,当我们想再次运行的时候只需调用即可,程序会记住上一次运行的位置,在系统里面保存,当下一次运行的时候,从yield开始执行。

       

        上面是yield执行函数的过程,第一次遇到yield的时候退出,并返回yield后面的返回的结果;第n>1次循环的时候从yield这里开始这行,先执行yield后面的语句,然后在重新执行while循环,再次遇到yield时终止循环。我们知道,yield也可以接收参数,但是要与send结合一起只用。重新执行函数。

  • 相关阅读:
    Runloop 新的看法
    如何利用openCV做灰度图片
    WebViewJavascriptBridge使用说明(iOS)
    页面滑动返回和点击返回按钮动作实现;
    获取设备UDID、IMEI、ICCID、序列号、Mac地址等信息
    设计模式----单例模式
    多线程理论知识 -- 小白的教程
    SQLite 的创建与编辑
    strong,weak, retain, assign的区别
    CGContextRef 画线简单用法
  • 原文地址:https://www.cnblogs.com/gengcx/p/6880643.html
Copyright © 2011-2022 走看看