如何在订阅时添加回调以写入文件

时间:2013-06-21 15:15:01

标签: python-2.7 callback pika python-pika

这可能是关于python回调的问题,就像使用鼠兔一样。我正在尝试开发一些订阅RabbitMQ中队列的代码,处理任何传递的消息的有效负载,然后将该有效负载写入一系列(磁盘)文件。因此,使用http://www.rabbitmq.com/tutorials/tutorial-one-python.html处的简单“Hello World”示例,我在逻辑中添加了回调函数(通常称为“回调”),以将任何收到的消息有效负载写入文件。

这是主要问题:我想编写一些额外的代码,如果某个时间段已经过去,例如300秒(5分钟),那么进程应关闭文件并创建一个新文件并写入任何后续的新文件收到的消息。等等...

但是 - 我发现的问题是当消息到达队列时,只会调用回调函数。我想我需要在回调函数之外的一些过程来测量经过的时间....

基本原理是我想创建一组磁盘文件(所有磁盘文件都有基于时间戳的唯一名称),这些磁盘文件包含MQ队列中收到的消息。如果消息来得很慢,那么我关闭当前打开的文件(这样可以进一步向下游处理)并打开另一个文件。

我还注意到在发出开始消费调用(channel.start_consuming)后,没有达到下面的代码 - 为什么?

我玩过python的多处理模块,但到目前为止还没有运气。

这是一些带有伪代码注释的框架代码: -

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

print ' [*] Waiting for messages. To exit press CTRL+C'

def callback(ch, method, properties, body):
    print " [x] Received %r" % (body,)

    # want to put code here to write message payloads to a file (unique name)
    # if n secs have elapsed then close the file and create a new file

channel.basic_consume(callback,queue='hello',no_ack=True)

channel.start_consuming()

谢谢!

1 个答案:

答案 0 :(得分:0)

可能值得一看Pika的替代实现。由于Pika本质上是封锁的,因此很难创造出类似这样的东西。您基本上需要另一个线程来监视IO,看看是否在过去五分钟内写了任何内容,否则关闭它。

您还可以保留时间戳,如果有足够的时间过了新的回调,您可以关闭该文件,然后创建一个新文件。但是,这会使文件保持打开的时间更长,但会阻止数据超过五分钟。

但是,我建议你改为Puka。它是Pika的一种非阻塞替代方案,可以让您更轻松地实现问题的解决方案。