Печать не происходит в потребителе микросервиса python pika внутри службы создания докеров

Я пытаюсь получать сообщения от моего производителя пищух. Я следую этому руководству: https://thewikihow.com/video_0iB5IPoTDts.

Я вижу, что когда я вручную запускаю docker-compose exec backend bash, а затем запускаю python consumer.py, я могу получать сообщения, и они регистрируются в стандартном выводе через функцию print(). Однако, когда я добавляю следующую службу в свой docker-compose.yml, контейнер не регистрируется в стандартном выводе:

rabbitmq_queue:
    build:
        context: .
        dockerfile: Dockerfile
    command: 'python consumer.py && echo hello'
    volumes:
        - .:/app
    depends_on:
        - db

Нет ошибки. Когда я меняю команду на echo hello, контейнер красиво выводит приветствие на стандартный вывод. Почему моя служба не регистрируется на стандартном выходе? Кроме того, кажется, что он работает правильно - когда я пытаюсь создать исключение, моя служба выдает ошибку. Когда он выходит из строя, он также начинает печатать сообщения. В противном случае он не печатает сообщения об ошибках.

Есть ли способ решить эту проблему?

consumer.py:

import pika

params = pika.URLParameters(
    "hidden thing here"
)

connection = pika.BlockingConnection(params)

channel = connection.channel()

channel.queue_declare(queue = "main")


def callback(channel, method, properties, body):
    print("[CONSUMER] Received message in main")
    print(body)
    # raise Exception()

channel.basic_consume(queue = "main", on_message_callback=callback, auto_ack=True)

print("[CONSUMER] Started consuming")

channel.start_consuming()

channel.close()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
357
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно начать потреблять сообщения. Сейчас у вас есть функция с именем callback, которая никогда не вызывается (и никогда не упоминается в вашем коде).

channel.basic_consume(queue='main', on_message_callback=callback)
channel.start_consuming()

Добавьте эти строки в конец вашего кода. Это назначит обратный вызов в качестве функции сообщения, а start_consuming скажет pika начать использовать очередь.

Более подробные примеры доступны здесь.

Я забыл добавить нижнюю часть моего кода. Я только что добавил это. Проблема только в сервисе, а не когда запускаю файл вручную.

advaiyalad 04.01.2021 02:50

Что произойдет, если вы добавите печать вверху приложения Python? Скорее всего, вы застряли, пытаясь подключиться к IP (неправильная сеть?).

eandersson 04.01.2021 05:04

Фактическая функциональность, кажется, работает нормально, и все сообщения отправляются. Только печать не работает... что-то с docker-compose наверное. Количество подключений увеличивается, поэтому я знаю, что он подключается. Проблема только с печатью.

advaiyalad 04.01.2021 17:11

может быть связано с переменной окружения PYTHONUNBUFFERED=1.

Jimmy Obonyo Abor 10.03.2021 20:36
Ответ принят как подходящий

Та же проблема. Рабочий контейнер без вывода. Я добавил PYTHONUNBUFFERED=1 для включения журнала.

# Dockerfile
ENV PYTHONUNBUFFERED=1 

Другие вопросы по теме