【问题标题】:Python stompest and yieldPython stompest 和 yield
【发布时间】:2015-10-30 12:15:19
【问题描述】:

我在使用 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 有什么问题吗?

【问题讨论】:

  • 你怎么打电话给receive?如果你只是在做x = receive(whatever) 就是这样,那么不会发生阻塞,因为生成器函数什么都不做,除非你对它们进行迭代或重复调用next。试试for frame in receive(whatever): do_something_here()
  • 你能创建一个MCVE吗?

标签: python python-2.7 yield


【解决方案1】:

当您将yield 放入函数中时,它会变成一个返回生成器的函数,该生成器仅在迭代或某种理解中需要它时才会被延迟评估。在你给出的第一种情况下,

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

要让生成器x 真正做点什么,你可以这样做:

for frame in x: print(frame)

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

【讨论】:

  • 这就是答案。我把它称为x = receive(stomp),而不是对其进行迭代。
猜你喜欢
  • 2016-04-17
  • 2015-08-17
  • 2014-01-10
  • 2016-06-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2020-04-07
  • 2011-08-23
相关资源
最近更新 更多