ZeroMq PUSH / PULL гарантирует, что очередь PU SH пуста - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть архитектура с 2 модулями (один на C ++ и один на Python), который обменивается данными через ZeroMQ с разъемами PUSH / PULL. PUSHER - это модуль C ++, а PULLER - это модуль Python. Третий модуль связывается в REQ / REP с этими двумя модулями, чтобы запросить указанную команду c (например, start, stop, kill, ...).

Мой Python модуль Cand может быть запущен в 3 разных режимы и могут переключаться между ними по запросу через REQ / REP. При переключении между режимами оба модуля C ++ en python останавливаются (переход в состояние IDLE STATE), а затем запускаются снова. C ++ имеет только один режим, но он переходит в IDLE_STATE, потому что в противном случае он работает даром и продолжает заполнять свою очередь отправки даром.

Но проблема в том, что модуль python сначала получает запрос на остановку, а затем C ++ модуль. Итак, модуль C ++ успевает продолжить заполнение своей очереди перед остановкой. Таким образом, при повторном запуске в другом режиме модуль python сначала получает сообщения из предыдущего режима, а затем получает сообщения из реального режима.

Итак, есть ли способ избежать такого поведения? Я думал о создании функции clearQueue в модуле python, чтобы он получал оставшиеся сообщения (и перебрасывал их в tra sh) перед запуском модуля C ++.

1 Ответ

0 голосов
/ 24 февраля 2020

Я провел дополнительные исследования, чтобы попытаться найти решение, но, похоже, простого решения не существует. Метка Hight Water (т.е. размер очереди) может быть установлена ​​на значение c, поэтому я подумываю установить его на единицу, но в конечном итоге оно может остаться с одним сообщением, оставшимся в очереди. Никто не может помочь?

РЕДАКТИРОВАТЬ: Я на самом деле добавил следующее на стороне python, что я обнаружил, что бросил ужасно. Но не может найти другое решение.

try:
    while True:
        self.bus.receiveData(zmq.NOBLOCK)
except:
    pass
...