Python 蟒蛇践踏与屈服
我在使用Python Stompest库生成到达时的帧时遇到了问题。当我在函数中包含Python 蟒蛇践踏与屈服,python,python-2.7,yield,Python,Python 2.7,Yield,我在使用Python Stompest库生成到达时的帧时遇到了问题。当我在函数中包含yield关键字时,代码不会像应该的那样阻塞并等待帧 def receive(stomp): received_messages = 0 while True: frame = stomp.receiveFrame() stomp.ack(frame) yield frame.body 但是,如果我所做的只是打印框架主体,那么它会像应该的那样等待
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
有什么问题吗?当你把yield
放在一个函数中时,它变成了一个返回生成器的函数,只有在某种迭代或理解中需要生成器时,才会对生成器进行惰性评估。在你给出的第一个案例中
>> x = receive(stomp)
>> type(x)
<type 'generator'>
当您迭代生成器时,它将实际执行您定义的函数中的语句(包括阻塞,直到帧到达),并为每次迭代返回帧。使用
yield
创建生成器对象可以省去实现状态以记住手动进行的迭代的麻烦。如何调用receive
?如果您只是在执行x=receive(whatever)
,那么就不会发生阻塞,因为生成器函数不会执行任何操作,除非您对它们进行迭代或重复调用next
。尝试接收帧中的(无论什么):在这里做点什么()
你能创建一个吗?这就是答案。我像x=receive(stomp)
一样调用它,而不是对它进行迭代。
for frame in x: print(frame)