Rabbitmq - start_consuming не может быть вызван из области другого обратного вызова BlockingConnection или BlockingChannel - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть два процесса Python, один потребительский процесс и один производственный процесс.Каждый процесс запускает соединение rabbitmq и порождает несколько потоков потребителей / производителей.Каждый поток создаст канал в соединении и выполнит логику отправки и получения сообщения.

Это мой потребительский поток

def consumer_thread(connection, routing_key):
    channel = connection.channel()
    result = channel.queue_declare(exclusive=True)
    queue_name = result.method.queue
    channel.queue_bind(exchange="test", routing_key=routing_key, queue=queue_name)
    thread_name = current_thread().name

    def process(ch, method, properties, body):
        print(f"{thread_name} received {body}")

    channel.basic_consume(process, queue=queue_name, no_ack=True)
    channel.start_consuming()

Это мой поток производителей

def producer_thread(connection, routing_key, sleep_time):
    channel = connection.channel()
    thread_name = current_thread().name
    count = 0

    while True:
        count += 1
        channel.basic_publish("test", routing_key=routing_key,
                              body=f"msg {count} from {thread_name}")
        time.sleep(sleep_time)

И я запускаю соединение rabbitmq, используя

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))

Однако, когда я запускаю свой код для первого сообщения, полученного в потоке потребителя, я получаю это сообщение об ошибке

Traceback (most recent call last):
  File "D:\app\cortex-bin\Python36\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "D:\app\cortex-bin\Python36\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "D:\app\cortex\background\core\scratch\test.py", line 18, in consumer_thread
    channel.start_consuming()
  File "D:\app\cortex-bin\Python36\lib\site-packages\pika\adapters\blocking_connection.py", line 1817, in start_consuming
    'start_consuming may not be called from the scope of 'pika.exceptions.RecursionError: start_consuming may not be called from the scope of another BlockingConnection or BlockingChannel callback'

Для всех последующих сообщений они могут быть получены потребителемтемы просто отлично.

Могу ли я знать, что является причиной этого исключения?Спасибо.

1 Ответ

0 голосов
/ 21 ноября 2018

Вы не можете получить доступ к соединению Pika из нескольких потоков ( комментарий ).Ваши потоки должны устанавливать свое собственное соединение и каналы.


ПРИМЕЧАНИЕ: команда RabbitMQ контролирует список рассылки rabbitmq-users и только иногда отвечаетвопросы по StackOverflow.

...