- 简单示例
import time
def consumer():
t = ''
while True:
result = yield t
print("消费{}".format(result))
time.sleep(5)
print("休息5秒....")
def product():
c1 = consumer()
c2 = consumer()
c1.send(None)
c2.send(None)
for i in range(10):
print("生产{}".format(i))
c1.send(i)
c2.send(i)
c1.close()
c2.close()
product()
-
python生成器原理:函数的调用满足“后进先出”的原则,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子。内存中以“后进先出”方式处理数据的栈段是最适合用于实现函数调用的载体,一般在编译型程序语言中,函数被调用后,函数的参数,
return地址,寄存器值等数据会被压入栈,待函数体执行完毕,将上述数据弹出栈。这意味着一个被调用的函数一旦执行完毕,它的生命周期就结束了。Python解释器运行的时候,会用C语言当中的PyEval_EvalFramEx函数创建一个栈帧,所有的栈帧都是分配在堆内存上,如果不主动释放,就会一直在里面。
(Python的堆栈帧是分配在堆内存中的。)Python解释器是个普通的C程序,所以它的堆栈帧就是普通的堆栈。但是它操作的Python堆栈帧是在堆上的,这意味着 Python 的堆栈帧可以在它的调用之外存活,也就是说在函数调用结束后,他的堆栈帧仍然可以存在),这个就是生成器的核心原理实现。





网友评论