Q: Каков правильный способ...?
О: Есть много способов достичь поставленной цели. Позвольте мне выбрать только один в качестве макета того, как обрабатывать распределенный обмен сообщениями между процессами.
Первый. Предположим, что в типичной задаче проектирования программного обеспечения есть больше приоритетов. Некоторые более высокие, некоторые более низкие, некоторые даже настолько низкие, что можно отложить выполнение этих низкоприоритетных подзадач, чтобы в планировщике оставалось больше времени для выполнения тех подзадач, которые не выдерживают ожидания.
Это сказало, давайте просмотрим ваш код. SUB
-сторонняя инструкция для .recv()
в том виде, в каком она использовалась, вызывает две вещи. Один видимый — он выполняет операцию RECEIVE на сокете ZeroMQ с поведением SUB
. Второй, менее заметный, он остается висящим, пока не получит что-то «совместимое» с текущим состоянием SUB
-поведения (подробнее об этом позже).
Это означает, что он также БЛОКИРУЕТ все время, так как такой .recv()
вызов метода ПОКА какое-то неизвестное, локально неконтролируемое совпадение состояний/событий заставляет его доставить ZeroMQ-сообщение, с его содержание совместимо с локально предустановленным состоянием этого (по-прежнему блокирующего) экземпляра SUB
-поведения.
Это может занять целую вечность.
Именно поэтому .recv()
скорее используется внутри цикла управления, где внешняя обработка получает как возможность, так и ответственность делать то, что вы хотите (включая операции, связанные с прерыванием, и справедливое/мягкое завершение с надлежащим освобождением ресурсов). ).
Процесс получения становится .recv( flags = zmq.NOBLOCK )
в try: except:
эпизоде. Таким образом, ваш локальный процесс не теряет контроль над потоком событий (включая NOP, являющийся одним из таких).
Лучший следующий шаг?
Не торопитесь и прочтите великолепную книгу драгоценных камней «Code Connected, Volume 1», которую опубликовал Питер ХИНТДЖЕНС, соучредитель ZeroMQ (также как PDF ).
Многие его мысли и ошибки, которых следует избегать, которыми он поделился с нами, действительно стоят вашего времени.
Наслаждайтесь возможностями ZeroMQ. Это очень мощный инструмент, и его стоит освоить сверху вниз.
person
user3666197
schedule
06.06.2015