2015-05-18 2 views
0

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

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

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

+0

Его не занятая петля - 'recv' блокируется до тех пор, пока сообщение не будет доступно. Сокеты zmq могут использоваться только в одном потоке, поэтому нет необходимости возвращать обратный вызов без потока, вызывающего в сокет. Если вы используете другую библиотеку с обратными вызовами, сообщите об этом в очереди потоков zmq. – tdelaney

ответ

0

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

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

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

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

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

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

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

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

+0

В комментарии выше, этот ответ предполагает либо использование poller ZMQ, либо флаг ZMQ_NOBLOCK на вашем вызове 'recv()', который заставит прием не блокировать и не создавать сценарий, о котором спрашивает OP выше. – Jason