兔子消息循环似乎消耗大量内存

时间:2017-01-31 17:28:24

标签: python rabbitpy

使用标准程序(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"

1 个答案:

答案 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中提取消息并且不知道如果你将来继续消费。这就是为什么你不是这样的原因。在网络面板中查看您的流程。