Управление автоматическим удалением очередей RabbitMQ в разных потоках. питон
Я хотел бы знать, является ли это правильным способом управления очередями auto_delete в разных потоках (в основном для тестирования, когда я не хочу, чтобы очереди RabbitMQ оставались при закрытии соединения)
import pika
from threading import Thread
class ConsumerThread(Thread):
def __init__(self, callback, queue):
Thread.__init__(self)
self.setDaemon(True)
self.callback = callback
self.queue = queue
def run(self):
# stablish connection
connection = pika.BlockingConnection(pika.ConnectionParameters(CONNECTION['address'], CONNECTION['port'], CONNECTION['vhost'], CONNECTION['credentials']))
channel = connection.channel()
# create the auto-delete queue
channel.queue_declare(queue=self.queue, auto_delete=True)
# start consuming
channel.basic_qos(prefetch_count=1)
channel.basic_consume(self.callback, queue=self.queue)
channel.start_consuming()
class Factory:
def __init__(self):
self.queue_init = "init.queue"
self.queue_start = "start.queue"
threads = [ConsumerThread(self.init_callback, self.queue_init), ConsumerThread(self.start_callback, self.queue_start)]
for t in threads:
t.start()
def init_callback(self, ch, method, properties, body):
# doing something
def start_callback(self, ch, method, properties, body):
# doing something
1 ответ
Команда RabbitMQ контролирует rabbitmq-users
список рассылки и только иногда отвечает на вопросы по Stackru.
Пика не является потокобезопасным. Вы должны быть уверены, что BlockingConnection
вызовы методов происходят в том же потоке, в котором работают соединение и канал. Исходя из вашего кода, я не уверен, что это произойдет, так как вы вызываете обратные вызовы в Factory
класс, который кажется странным. Почему бы не использовать эти методы в ConsumerThread
вместо?
Пика 0.12
и позже будет включать add_callback_threadsafe
метод, который запланирует выполнение метода в потоке ioloop.