繁体   English   中英

在不同线程中管理RabbitMQ自动删除队列。 蟒蛇

[英]Manage RabbitMQ auto-delete queues in different threads. Python

我想知道这是否是在不同线程中管理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

RabbitMQ团队监视rabbitmq-users邮件列表,并且仅在某些情况下回答有关StackOverflow的问题。


Pika不是线程安全的。 您必须确保BlockingConnection方法调用发生在运行连接和通道的同一线程上。 根据您的代码,我不确定这种情况是否会发生,因为您在Factory类中调用了回调,这似乎很奇怪。 为什么在ConsumerThread没有这些方法呢?

Pika 0.12和更高版本将包含add_callback_threadsafe方法,该方法将安排在ioloop线程上执行的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM