Как правильно выполнить однократную блокировку синхронного приема с Пика? - PullRequest
0 голосов
/ 10 января 2019

Я бы хотел использовать Pika / RabbitMQ в схеме, похожей на стандартную розетку: настроить соединение, а затем блокировать синхронные вызовы, чтобы получать одно сообщение каждый раз, когда я готов выполнить больше работы.

Вариант A: basic_get

Метод basic_get для BlockingConnection предлагает возможность получить сообщение, но он немедленно возвращается, если нет доступных сообщений для приема. Это похоже на вызов сокета recv с отключенной блокировкой. Я мог бы использовать этот подход с тайм-аутом для непрерывного опроса, но это не эффективно.

Вариант B: basic_consume

Метод basic_consume для BlockingConnection мог бы выполнить эту работу, но у него есть странное требование, что у меня есть start_consuming() где-то в другом потоке. Так как мои клиенты моего метода receive уже ожидают блокировки, ожидая сообщения, это кажется пустой тратой.

Возможно ли с Пика сделать эквивалент socket.recv(blocking=True)?

1 Ответ

0 голосов
/ 11 января 2019

Запустите Pika в своем собственном потоке и basic_consume со значением предварительной выборки 1 (если вы действительно хотите одно сообщение за раз). Вставьте сообщения в некую синхронизированную структуру данных, которую ваши абоненты могут заблокировать.

Не забудьте правильно подтвердить ваши сообщения из других тем ( пример )


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

...