假如我们编写一个程序去取钱,比如5万,银行要审核大额取款,审核时间三十分钟,如果通常的串行程序,就要等银行的反馈结果,程序才能继续执行,yield就是避免这种情况,让程序继续等待,程序本身执行下面程序。串行是同步,生成器就是异步的情况。
生成器可以从断点处继续执行代码。生成器可以保存函数的中断状态。
作用:
这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句执行。
另外,还可以通过yield实现在单线程的情况下并发运算的效果。
下面来看一个实例:
import time
#导入时间函数,让程序执行等待
def consumer(name):
#消费者模型
print("%s 准备吃包子啦!"%name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
#来了两个消费者买包子
c = consumer("A")
c2 = consumer("B")
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)
producer("alex")
导入时间模块,定义生产者多久可以生成包子,定义两个模块,一个是生成者模块,一个是消费这模块,消费者模块功能是告诉生产者有消费者来买包子了,并且接收生产者生产的包子;生产者的模型是接收两个消费者来的消息,并且开始生产包子,并且生产者生成包子是需要时间的,生产完包子之后把使用send把包子发给消费者。