I would like to know if this is the correct way to manage auto_delete queues in different threads (is mainly for testing issues where I don't want the RabbitMQ queues stay when connection closes)
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
The RabbitMQ team monitors the rabbitmq-users
mailing list and only sometimes answers questions on StackOverflow.
Pika is not thread-safe. You must be sure that BlockingConnection
method calls happen on the same thread that the connection and channel are running on. Based on your code, I'm not sure that is going to happen since you call callbacks in the Factory
class, which seems strange. Why not have those methods in ConsumerThread
instead?
Pika 0.12
and later will include an add_callback_threadsafe
method that will schedule a method to execute on the ioloop thread.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.