Python stompest和yield

时间:2015-10-30 12:15:19

标签: 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

但是,如果我所做的只是打印框架体,那么它就像它应该

一样
def receive(stomp):
    while True:
        frame = stomp.receiveFrame()
        stomp.ack(frame)
        print frame.body

在此上下文中使用yield是否有问题?

1 个答案:

答案 0 :(得分:1)

当你将yield放在一个函数中时,它就变成了一个返回一个生成器的函数,只有当迭代或某种类型的理解需要它时才会懒惰地计算它。在你给出的第一个案例中,

>> x = receive(stomp)
>> type(x)
<type 'generator'>

要使生成器x实际执行某些操作,您可以执行以下操作:

for frame in x: print(frame)

当您遍历生成器时,它实际上将执行您定义的函数中的语句(包括阻塞直到帧到达)并返回每次迭代的帧。使用yield创建生成器对象可以省去实现状态的麻烦,以便记住您手动进行的迭代。