day4 使用yield实现单线程

Posted (野生程序员)

tags:

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

 

 

 

 

 

 

 

 

 

import time
#导入time模块,用于给生产者生成包子定义时间,比如银行处理完成之后告诉用户信息
def consumer(name):
#消费者模块
print("准备吃包子了!....")
while True:
#循环,死循环,可以使用yield来处理,并且保持在某一个状态
baozi = yield
#使用yield来接收send()传递过来的参数,yieldsend()结合使用
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")

以上是关于day4 使用yield实现单线程的主要内容,如果未能解决你的问题,请参考以下文章

2017/9/5的学习内容___通过yield实现在单线程的情况下实现并发运算的效果

python 协程

通过生成器yield实现单线程的情况下实现并发运算效果(异步IO的雏形)

协程,yield,i多路复用,复习

Python3 生成器实现单线程并发

线程代替epll实现协程的原理(yield调用next时的函数使用其他线程进行处理,不影响主线程继续运行,next异步处理线程处理后使用send传回处理结果)