2015-05-27 3 views
4

Я пытаюсь выяснить, есть ли у меня две подпрограммы, вызывающие один и тот же сокет zeromq, если при возврате из socket.recv() в процедуре 1 возвращается. Сокет будет знать, чтобы вернуться в подпрограмма1 (то же самое для рутинных2, ... рутин).ZeroMQ знает, какой из подпрограмм запрашивается от

Следовательно ... используя шину обмена сообщениями с семантикой запроса/ответа, каков наилучший образец для подхода к этому в go?

Если это помогает ... подумать о простой схеме пирата и реализовать вызов стиля RPC, установленный в этом шаблоне с помощью zeromq.

Socket; //zeromq socket 
//routine 1 
socket.send(data) // do i need some identifier here for this routine? 
socket.recv() // wait until i get a response from that send 
//routine 2 
socket.send(data) 
socket.recv() 

так что в этом случае я понятия не имею, будет ли возвращаться ответ от обычной1 или обычной2. Как я могу убедиться, что когда я получаю ответ на сокет ... я могу сообщить о правильной функции recv() функции.

Спасибо!

+0

Просьба предоставить больше кода, или, по крайней мере, более полно конкретизирован, например. Вы намерены сделать это в одном потоке или нескольких потоках? Какие типы сокетов вы используете как на этом (клиент?) Конце, так и на одноранговом узле, с которым вы отправляете сообщения? Как вы подключаетесь/связываетесь? Что отличает одну «рутину» от другой «подпрограммы» в вашем коде/данных? В зависимости от ответов на эти вопросы существует любое количество возможных решений. – Jason

+0

У меня есть нулевой опыт/знание ZeroMQ, но в прошлом, когда у меня было несколько goroutines, делающих запросы по общему сетевому ящику, у меня была центральная goroutine, где запросы, где на самом деле написаны, и ответы читаются. Эта функция имела входной канал ({запрос, канал ответа)), карту выдающихся идентификаторов запросов (сгенерированных последовательно) и только что использовал эту карту для поиска соответствующего канала для отправки тела ответа (или для регистрации и удаления это, если не было записи карты). –

+0

Ну, у меня нет опыта/знаний о Go, так что мы не делаем пару :). Если вы еще не прочитали [The Guide] (http://zguide.zeromq.org/page:all), я настоятельно рекомендую вам это сделать, в документе есть всевозможные примеры по всему документу (всякий раз, когда вы видите пример кода , будет ссылка на версию на разных языках, с быстрым взглядом, похоже, что большинство из них имеют вариант Go). Вероятно, вы увидите, что вы пытаетесь сделать, и посмотрите пример этого. – Jason

ответ

1

Я не верю, что сокет может быть разделен, одновременно, между потоками с использованием ZeroMQ

Вероятно, что вам нужно сделать какой-то goroutine, что прослушивает запросы, отправляет/получает zmq, а затем отвечает.

, например: (непроверенный код)

type Req struct { 
    Data []byte 
    Reply chan []byte 
} 

go func() { // probably not the zmq api, but you should get the idea here 
    for req := <- requests { 
     socket.send(req.Data) 
     req.Reply <- socket.recv() 
    } 
} 
Смежные вопросы