Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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
Kombu python-强制阻塞/同步行为(或仅在前一个操作完成时处理消息)_Python_Kombu - Fatal编程技术网

Kombu python-强制阻塞/同步行为(或仅在前一个操作完成时处理消息)

Kombu python-强制阻塞/同步行为(或仅在前一个操作完成时处理消息),python,kombu,Python,Kombu,我处理rabbitmq队列并调用django函数/管理命令等。我的问题是我绝对需要正确的执行顺序。在消息1和2的处理程序完成之前,消息3的处理程序永远不能运行。我需要确保Kombu在处理完前一条消息之前不会处理另一条消息: 以这个基类为例 class UpdaterMixin(object): # binding management commands to event names # override in subclass event_handlers = {}

我处理rabbitmq队列并调用django函数/管理命令等。我的问题是我绝对需要正确的执行顺序。在消息1和2的处理程序完成之前,消息3的处理程序永远不能运行。我需要确保Kombu在处理完前一条消息之前不会处理另一条消息:

以这个基类为例

class UpdaterMixin(object):
    #  binding management commands to event names
    #  override in subclass
    event_handlers = {}
    app_name = ''   #override in subclass

    def __init__(self):
        if not self.app_name or len(self.event_handlers) == 0:
            print('app_name or event_handlers arent implemented')
            raise NotImplementedError()
        else:
            self.connection_url = settings.BROKER_URL
            self.exchange_name = settings.BUS_SETTINGS['exchange_name']
            self.exchange_type = settings.BUS_SETTINGS['exchange_type']
            self.routing_key = settings.ROUTING_KEYS[self.app_name]

    def start_listener(self):
        logger.info('started %s updater listener' % self.app_name)\\
        with Connection(self.connection_url) as connection:
            exchange = Exchange(self.exchange_name, self.exchange_type, durable=True)
            queue = Queue('%s_updater' % self.app_name, exchange=exchange, routing_key=self.routing_key)
            with connection.Consumer(queue, callbacks=[self.process_message]) as consumer:
                while True:
                    logger.info('Consuming events')
                    connection.drain_events()

    def process_message(self, body, message):


        logger.info('data received: %s' % body)
        handler = self.event_handlers[body['event']]
        logger.info('Executing management command: %s' % str(handler))
        data = json.dumps(body)
        call_command(handler, data, verbosity=3, interactive=False)
        message.ack()
有没有办法强迫kombu做出这种行为?我不在乎锁是在处理完成之前不排空另一个事件,还是在前一个进程完成之前不运行另一个进程消息,或者是任何其他方法来实现这一点。我只需要确保执行秩序得到严格维护


我很乐意在这方面得到任何帮助

刚刚了解到,由于python默认为单线程,因此该代码默认为阻塞/同步,除非我显式地将其重写为异步。如果有人碰到这个