zeromq pub/sub pattern, слушатель всегда использует занятый цикл для проверки сообщения?

Я новичок в ZeroMQЯ видел несколько примеров, кажется, всегда вовлекает слушателя, чтобы сделать занятый цикл, чтобы получить сообщение, например, в pub/sub шаблон. получатель должен будет сделать это, чтобы получить сообщение,

while (true)
{
    var message = socket.Recv(Encoding.UTF8);
    message.Dump();
}

Существует ли какой-либо механизм обратного вызова, например, получатель просто зарегистрирует себя в сокете, и всякий раз, когда есть сообщение, оно будет вызываться, вместо того, чтобы заниматься циклическим проверкой сообщения.

1 ответ

Зависит от вашего выбора языка. Если, например, вы используете node.js, все это обратные вызовы.

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

Причина, по которой вы обычно видите цикл, который сосредоточен исключительно на получении сообщений, двояка:

  1. Это примеры, и это самый простой способ написать пример, который будет эффективно получать и обрабатывать сообщения.
  2. ZMQ - это набор инструментов большого объема, обычно, когда вы используете его, получение сообщений является для вас задачей с высоким приоритетом, поэтому выделение всей цепочки для получения этих сообщений может быть хорошей идеей.

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

while (functional_task) {
    while (msg = socket.recv()) {
        handle(msg);
    }
    do_other_stuff();
}

... таким образом, вы обрабатываете все поставленные в очередь сообщения один раз за функциональный цикл, а не зацикливаетесь исключительно на ваших сообщениях.

Возможность использования системы обратного вызова зависит от вашего языка и привязки ZMQ.

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