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
创建生成器对象可以省去实现状态以记住您手动进行的迭代的麻烦。
我在使用 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
创建生成器对象可以省去实现状态以记住您手动进行的迭代的麻烦。