Можно ли добавить обработку событий в ZeroMQ, чтобы действовать при получении / отправке данных?
Я создал два несвязанных процесса-демона в C в Linux Ubuntu. Эти процессы находятся в спящем режиме, они просыпаются только при получении данных, выполняют действие, реализованное в обработчике сигнала, и снова спят.
Я реализовал это общение, используя SIGNAL IPC и очередь сообщений. Перед отправкой сообщения отправляю сигнал SIGUSR1
а затем отправить данные, и я написал обработчик сигнала для SIGUSR1
выполнить необходимые действия.
Я хотел бы реализовать тот же способ связи с использованием ZeroMQ, и я читал их руководство, чтобы выяснить, есть ли у ZeroMQ какой-либо способ обработки событий или метод уведомления для другого процесса, когда поступают данные (для языка Си).
Я также сослался на следующую ссылку:
Есть ли в ZeroMQ уведомление / событие обратного вызова / сообщение о поступлении данных?
Но все же я сомневаюсь.
Сообщает ли ZeroMQ или инициирует ли другой процесс какое-либо событие, когда отправляются новые данные (я не хочу ждать или poll()
до тех пор, пока данные не поступят, вместо этого мой демон-процесс будет находиться в спящем режиме, а при поступлении данных он выполнит свой обработчик и снова перейдет в спящий режим)
Было бы здорово, если кто-то может помочь / предложить по этому вопросу.
1 ответ
Нет.
В состоянии "как есть" ZeroMQ не реализует ни триггер, ни обратный вызов.
Зачем?
Поскольку основной подход к обмену сообщениями заключается в использовании очередей, а не в нарушении потока процессов, если сами процессы не находят целесообразным запросить очередь (будь то с помощью интеллектуального способа, тестирование с помощью .poll()
или тупым путем, прямым звонком .recv( ZMQ_NOBLOCK )
), если есть какие-либо сообщения, готовые и ожидающие их последующей обработки, а затем начнут .recv()
они из потока (ов) на стороне ZeroMQ и его ресурсов и обрабатывают их в соответствии со своими собственными процессами и рабочим процессом.
Но POSIX SIGNAL
Механика изменения правил игры:
Учитывая факты о самом ZeroMQ, SIGUSR1
может доставить независимый (только выровненный по контексту использования) сигнал " Out-of-Band " принимающему процессу о том, что процесс-отправитель только что отправил некоторую информацию для обработки, отправки и доставки в будущем, поэтому Процесс получения может активировать и следовать инструментам и методам для .recv()
-ing данные из пути доставки ZeroMQ, несмотря на то, что механика ZeroMQ не предоставляет методы обратного вызова самостоятельно.
Таким образом, в этом смысле, что даже обязательная языковая реализация алгоритма становится осведомленной в контексте использования об успехе / неудаче последнего вызова ZeroMQ, уровень сигнализации O/S POSIX (полностью независимый от распределенной доставки сообщений / сигнализации ZeroMQ). инфраструктура) может обеспечить такие востребованные средства межпроцессной координации, нацеленные на работу даже между спящими / демоническими экземплярами тестируемых сетей процессов.