rabbitmq中的多个消费者为多个队列
问题描述:
我有2个队列,比如说q1和q2,它对应于e1和e2与绑定密钥b1和b2交换。我想要并行运行消费者功能,比如c1和c2,它们将分别监听q1和q2。我试了下面的方法:rabbitmq中的多个消费者为多个队列
def c1():
connection = pika.BlockingConnection(pika.ConnectionParameters(host=constants.rmqHostIp))
channel = connection.channel()
channel.exchange_declare(exchange='e1', durable='true',
type='topic')
result = channel.queue_declare(durable='false', queue='q1')
queue_name = result.method.queue
binding_key = "b1"
channel.queue_bind(exchange='e1',
queue=queue_name,
routing_key=binding_key)
channel.basic_consume(callback,queue=queue_name,no_ack=False)
channel.start_consuming()
def c2():
connection = pika.BlockingConnection(pika.ConnectionParameters(host=constants.rmqHostIp))
channel = connection.channel()
channel.exchange_declare(exchange='e2', durable='true',
type='topic')
result = channel.queue_declare(durable='false', queue='q2')
queue_name = result.method.queue
binding_key = "b2"
channel.queue_bind(exchange=e1,
queue=queue_name,
routing_key=binding_key)
channel.basic_consume(callback,queue=queue_name,no_ack=False)
channel.start_consuming()
if __name__ == '__main__':
c1()
c2()
但是,它只是侦听c1函数和c2函数,它没有被执行。我怎样才能运行这两个功能? 在此先感谢。
编辑:我有方法c1和在2个不同的模块(文件)C1
答
为了运行两种功能同时一些多线程的方法需要在顺序。请看一下here的一些python例子。
这是用Process类修改的代码。它也可以使用线程或从OS明确运行它。
import pika
from multiprocessing import Process
def callback():
print 'callback got data'
class c1():
def __init__(self):
self.connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
self.channel = self.connection.channel()
self.channel.exchange_declare(exchange='e1', durable='true', type='topic')
result = self.channel.queue_declare(durable='false', queue='q1')
queue_name = result.method.queue
binding_key = "b1"
self.channel.queue_bind(exchange='e1', queue=queue_name, routing_key=binding_key)
self.channel.basic_consume(callback,queue=queue_name,no_ack=False)
def run(self):
self.channel.start_consuming()
class c2():
def __init__(self):
self.connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
self.channel = self.connection.channel()
self.channel.exchange_declare(exchange='e2', durable='true', type='topic')
result = self.channel.queue_declare(durable='false', queue='q2')
queue_name = result.method.queue
binding_key = "b2"
self.channel.queue_bind(exchange='e1', queue=queue_name, routing_key=binding_key)
self.channel.basic_consume(callback,queue=queue_name,no_ack=False)
def run(self):
self.channel.start_consuming()
if __name__ == '__main__':
subscriber_list = []
subscriber_list.append(c1())
subscriber_list.append(c2())
# execute
process_list = []
for sub in subscriber_list:
process = Process(target=sub.run)
process.start()
process_list.append(process)
# wait for all process to finish
for process in process_list:
process.join()
你应该使用python线程模块或一些替代阻止连接。 – alphiii