我正在开发一个Python应用程序,它有一个后台线程,用于消费RabbitMQ队列中的消息(主题场景)。
我在按钮的单击事件上启动线程。 这是我的代码,请注意“#self.receive_command()”。
def on_click_start_call(self,widget):
t_msg = threading.Thread(target=self.receive_command)
t_msg.start()
t_msg.join(0)
#self.receive_command()
def receive_command(self):
syslog.syslog("ENTERED")
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
syslog.syslog("1")
channel = connection.channel()
syslog.syslog("2")
channel.exchange_declare(exchange='STORE_CMD', type='topic')
syslog.syslog("3")
result = channel.queue_declare(exclusive=True)
syslog.syslog("4")
queue_name = result.method.queue
syslog.syslog("5")
def callback_rabbit(ch,method,properties,body):
syslog.syslog("RICEVUTO MSG: RKEY:"+method.routing_key+" MSG: "+body+"\n")
syslog.syslog("6")
channel.queue_bind(exchange='STORE_CMD', queue=queue_name , routing_key='test.routing.key')
syslog.syslog("7")
channel.basic_consume(callback_rabbit,queue=queue_name,no_ack=True)
syslog.syslog("8")
channel.start_consuming()
如果运行此代码,在syslog上看不到消息1、2、3、5、6、7、8,但只能看到“ENTERED”。所以,代码锁定在pika.BlokingConnection上。
如果我运行相同的代码(注释线程指令并取消对函数的直接调用),则所有操作都按要求进行,并且正确接收消息。
有什么解决方案可以让消费者进入线程?
提前谢谢
戴维德
我用最新版本的Pika在我的机器上测试了代码。它工作得很好。Pika存在线程问题,但只要每个线程创建一个连接,就不应该是问题。
如果您遇到问题,很可能是因为旧版本Pika中的错误,或者与线程无关的问题导致了问题。
我建议您避免使用0.9.13,因为有多个bug,但是
0.9.140.10.0应该很快就会发布™.[编辑]Pika 0.9.14已经发布。
这是我使用的代码。
另一种方法是传递给线程方法
channel.start_consuming
作为目标,然后将回调传递给consume
方法。 用法:consume(callback=your_method, queue=your_queue)
相关问题 更多 >
编程相关推荐