使用标准程序(for循环),如示例中所示,我们发现机器上使用了大量内存。即似乎队列中的所有消息都被加载到内存中并且也被确认。这种方法是here。我假设队列是一个发电机。
import rabbitpy
with rabbitpy.Connection('amqp://guest:guest@localhost:5672/%2f') as conn:
with conn.channel() as channel:
queue = rabbitpy.Queue(channel, 'example')
# Exit on CTRL-C
try:
# Consume the message
for message in queue:
message.pprint(True)
message.ack()
except KeyboardInterrupt:
print 'Exited consumer'
现在,如果我们转到getter消息,通过.get()
一次使用一条消息,则内存消耗较少。然而,我的代码(使用无限循环)确保我们的消费者在队列中没有消息时运行 - 效果更好,但是在Web控制面板中,似乎没有显示消费者,即某种程度上无法识别此过程作为消费者 - 我们如何解决这个问题,以便在网络面板上我们检测到消费者?
queue_read = rabbitpy.Queue(channel, QUEUE_NAME)
while True:
body = queue_read.get() ## pop one at a time.
if body == None:
time.sleep(3)
continue
body.ack()
print " [x] OK - got a message"
答案 0 :(得分:1)
看起来你需要的是在使用队列时设置prefetch
属性。而不是:
for message in queue:
# handle message
尝试改为:
for message in queue.consume(prefetch=5): # or some other reasonable value
# handle message
__iter__
类上的Queue
方法只是对consume
方法本身的简单调用。
consume
方法将channel
设置为consuming
状态,而get
方法仅从channel
中提取消息并且不知道如果你将来继续消费。这就是为什么你不是这样的原因。在网络面板中查看您的流程。