gpt4 book ai didi

Python Pika - 消费者进入线程

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:22 26 4
gpt4 key购买 nike

我正在开发一个带有后台线程的 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()

如果我运行这段代码,我在系统日志上看不到消息 1,2,3,5,6,7,8 但我只能看到“已输入”。因此,代码锁定在 pika.BlokingConnection 上。

如果我运行相同的代码(注释线程指令并取消对函数的直接调用的注释),所有工作都按预期进行并且消息被正确接收。

有什么解决方案可以让消费者进入线程吗?

提前致谢

大卫

最佳答案

我已经在我的机器上用最新版本的 Pika 测试了代码。它工作正常。 Pika 存在线程问题,但只要您为每个线程创建一个连接,就不会有问题。

如果您遇到问题,很可能是因为旧版本 Pika 中的错误,或者与您的线程无关的问题导致了问题。

我建议您避免使用 0.9.13,因为存在多个错误,但是 0.9.14 0.10.0 应该很快发布™。

[编辑]Pika 0.9.14 已发布。

这是我使用的代码。

def receive_command():
print("ENTERED")
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
print("1")
channel = connection.channel()
print("2")
channel.exchange_declare(exchange='STORE_CMD', type='topic')
print("3")
result = channel.queue_declare(exclusive=True)
print("4")
queue_name = result.method.queue
print("5")
def callback_rabbit(ch,method,properties,body):
print("RICEVUTO MSG: RKEY:"+method.routing_key+" MSG: "+body+"\n")
print("6")
channel.queue_bind(exchange='STORE_CMD', queue=queue_name , routing_key='test.routing.key')
print("7")
channel.basic_consume(callback_rabbit,queue=queue_name,no_ack=True)
print("8")
channel.start_consuming()

def start():
t_msg = threading.Thread(target=receive_command)
t_msg.start()
t_msg.join(0)
#self.receive_command()
start()

关于Python Pika - 消费者进入线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16359404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com