我遇到使用Python Stompest库在帧到达时产生帧的问题。当我在函数中包含yield
关键字时,代码不会阻塞并等待它应该的帧。
def receive(stomp):
received_messages = 0
while True:
frame = stomp.receiveFrame()
stomp.ack(frame)
yield frame.body
但是,如果我所做的只是打印框架体,那么它就像它应该
一样def receive(stomp):
while True:
frame = stomp.receiveFrame()
stomp.ack(frame)
print frame.body
在此上下文中使用yield
是否有问题?
答案 0 :(得分:1)
当你将yield
放在一个函数中时,它就变成了一个返回一个生成器的函数,只有当迭代或某种类型的理解需要它时才会懒惰地计算它。在你给出的第一个案例中,
>> x = receive(stomp)
>> type(x)
<type 'generator'>
要使生成器x
实际执行某些操作,您可以执行以下操作:
for frame in x: print(frame)
当您遍历生成器时,它实际上将执行您定义的函数中的语句(包括阻塞直到帧到达)并返回每次迭代的帧。使用yield
创建生成器对象可以省去实现状态的麻烦,以便记住您手动进行的迭代。