相关疑难解决方法(0)

在python/pika中使用多个队列

我正在尝试创建一个订阅多个队列的消费者,然后在消息到达时处理它们.

问题是当第一个队列中已经存在某些数据时,它会占用第一个队列,而不会消耗第二个队列.但是,当第一个队列为空时,它会转到下一个队列,然后同时消耗这两个队列.

我首先实现了线程,但是想要避开它,当pika库为我做的时候没有太多的复杂性.以下是我的代码:

import pika

mq_connection = pika.BlockingConnection(pika.ConnectionParameters('x.x.x.x'))
mq_channel = mq_connection.channel()
mq_channel.basic_qos(prefetch_count=1)


def callback(ch, method, properties, body):
    print body
    mq_channel.basic_ack(delivery_tag=method.delivery_tag)

mq_channel.basic_consume(callback, queue='queue1', consumer_tag="ctag1.0")
mq_channel.basic_consume(callback, queue='queue2', consumer_tag="ctag2.0")
mq_channel.start_consuming()
Run Code Online (Sandbox Code Playgroud)

python rabbitmq pika

31
推荐指数
2
解决办法
8350
查看次数

Python Pika - 消费者线程

我正在开发一个带有后台线程的Python应用程序,用于消费来自RabbitMQ队列的消息(主题场景).

我在Button的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()
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码,我在syslog上看不到消息1,2,3,5,6,7,8但我只能看到"已输入".所以,代码被锁定在pika.BlokingConnection上.

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

有任何解决方案可以将消费者运行到线程中吗?

提前致谢

达维德

python multithreading rabbitmq pika

3
推荐指数
2
解决办法
5978
查看次数

标签 统计

pika ×2

python ×2

rabbitmq ×2

multithreading ×1