【发布时间】:2013-05-03 12:52:53
【问题描述】:
我正在开发一个带有后台线程的 Python 应用程序,用于消费来自 RabbitMQ 队列的消息(主题场景)。
我在按钮的 on_click 事件上启动线程。 这是我的代码,请注意“#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 上。
如果我运行相同的代码(注释线程指令并取消对函数的直接调用),所有工作都按预期进行,并且消息被正确接收。
有什么解决方案可以让消费者进入线程?
提前致谢
大卫
【问题讨论】:
标签: python multithreading rabbitmq pika