Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Kombu-blocking_Python_Multithreading_Rabbitmq_Pika_Kombu - Fatal编程技术网

Python-Kombu-blocking

Python-Kombu-blocking,python,multithreading,rabbitmq,pika,kombu,Python,Multithreading,Rabbitmq,Pika,Kombu,我使用kombu通过生产者/消费者模型管理RabbitMQ。我启动了我的producer,它在一个队列中放置了100个作业,我只有一个队列和一个交换。我想同时启动多个消费者,让每个消费者一次处理一个作业。不幸的是,消费者之间相互阻塞,即当一个消费者从队列中抢到一份工作时,其他消费者只是无所事事。如果我杀死了正在工作的消费者,那么其他消费者中的一个就会介入并开始工作。有没有办法让所有使用者同时运行,每个使用者处理队列中的不同作业?我的消费者代码如下: def start_consumer(self

我使用kombu通过生产者/消费者模型管理RabbitMQ。我启动了我的producer,它在一个队列中放置了100个作业,我只有一个队列和一个交换。我想同时启动多个消费者,让每个消费者一次处理一个作业。不幸的是,消费者之间相互阻塞,即当一个消费者从队列中抢到一份工作时,其他消费者只是无所事事。如果我杀死了正在工作的消费者,那么其他消费者中的一个就会介入并开始工作。有没有办法让所有使用者同时运行,每个使用者处理队列中的不同作业?我的消费者代码如下:

def start_consumer(self, incoming_exchange_name):
    if self.rabbitmq_connection.connected:
        callbacks=[]
        queues=[]

        callbacks.append(self._callback)
        queues.append(self.incoming_queue)

        print 'opening a new *incoming* rabbitmq connection to the %s exchange for the %s queue' % (self.incoming_exchange.name, self.incoming_queue.name)
        self.incoming_exchange(settings.rabbitmq_connection).declare()
        self.incoming_queue(settings.rabbitmq_connection).declare()

        with settings.rabbitmq_connection.Consumer(queues=queues, callbacks=callbacks) as consumer:
            while True:
                try:
                    self.rabbitmq_connection.drain_events()
                except Exception as e:
                    print 'Error -> %s' % e.message 

我认为你基本上是想自己重写芹菜:


除非你纯粹是为了学习而做,否则不要痛苦,用芹菜。顺便说一句,kombu和RabbitMQ正是芹菜用作后端的东西,更不用说Redis后端是可用的,这为我在一些应用程序中节省了数不清的时间。

我认为你实际上是在试图自己重写芹菜:


除非你纯粹是为了学习而做,否则不要痛苦,用芹菜。顺便说一句,kombu和RabbitMQ正是芹菜用作后端的东西,更不用说Redis后端是可用的,这在某些应用程序中为我节省了数不清的时间。

您需要将消费者预回迁设置为1,这样每个消费者只需抓取1条消息,其余的则留在队列中,状态就绪,因此,如果您有两个QOS设置为1的使用者,并且您有100条消息,那么您将同时处理两个任务

我已将缺少的部分添加到您的代码中,以设置预回迁计数

def start_consumer(self, incoming_exchange_name):
if self.rabbitmq_connection.connected:
    callbacks=[]
    queues=[]

    callbacks.append(self._callback)
    queues.append(self.incoming_queue)

    print 'opening a new *incoming* rabbitmq connection to the %s exchange for the %s queue' % (self.incoming_exchange.name, self.incoming_queue.name)
    self.incoming_exchange(settings.rabbitmq_connection).declare()
    self.incoming_queue(settings.rabbitmq_connection).declare()

    channel = self.rabbitmq_connection.channel()
    channel.basic_qos(prefetch_size=0, prefetch_count=1, a_global=False)

    with settings.rabbitmq_connection.Consumer(queues=queues, callbacks=callbacks, channel=channel) as consumer:
        while True:
            try:
                self.rabbitmq_connection.drain_events()
            except Exception as e:
                print 'Error -> %s' % e.message 

您需要将使用者预回迁设置为1,这样每个使用者将只抓取1条消息,并将队列中的其余部分保留为就绪状态,因此,如果有2个使用者的QOS设置为1,并且有100条消息,则您将同时处理2个任务

我已将缺少的部分添加到您的代码中,以设置预回迁计数

def start_consumer(self, incoming_exchange_name):
if self.rabbitmq_connection.connected:
    callbacks=[]
    queues=[]

    callbacks.append(self._callback)
    queues.append(self.incoming_queue)

    print 'opening a new *incoming* rabbitmq connection to the %s exchange for the %s queue' % (self.incoming_exchange.name, self.incoming_queue.name)
    self.incoming_exchange(settings.rabbitmq_connection).declare()
    self.incoming_queue(settings.rabbitmq_connection).declare()

    channel = self.rabbitmq_connection.channel()
    channel.basic_qos(prefetch_size=0, prefetch_count=1, a_global=False)

    with settings.rabbitmq_connection.Consumer(queues=queues, callbacks=callbacks, channel=channel) as consumer:
        while True:
            try:
                self.rabbitmq_connection.drain_events()
            except Exception as e:
                print 'Error -> %s' % e.message 

实际上,芹菜在分布式任务运行的特定用例中有帮助。它很擅长这个。但是OP可能会在这个过程中尝试并误用job这个词来做其他事情,比如使用amqp消息队列在不同服务之间进行有序、持久且最终一致的事件驱动通信。或者类似的东西。芹菜不是为有序的事件驱动体系结构而构建的。@alonisser-是的,芹菜还不够,芹菜在分布式任务运行的特定用例中有帮助。它很擅长这个。但是OP可能会在这个过程中尝试并误用job这个词来做其他事情,比如使用amqp消息队列在不同服务之间进行有序、持久且最终一致的事件驱动通信。或者类似的东西。芹菜不是为有序的事件驱动架构而构建的。@alonisser-是的,芹菜是不够的