Python 踩踏和屈服

Python stompest and 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 有什么问题吗?

当你把 yield 放在一个函数中时,它就变成了一个 return 生成器的函数,只有在迭代或某种理解中需要它时才会延迟计算。在你给出的第一个案例中,

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

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

for frame in x: print(frame)

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