2013-03-09 2 views
7

Я строю инфраструктуру (в C), где несколько отдельных служб обмениваются данными через ZeroMQ. Теперь, чтобы все это выполнялось быстро и плавно, я хочу, чтобы ZeroMQ выполнялся асинхронно.
Я знаю, что IO-поток ZeroMQ уже отделен, но я хочу выполнять несколько задач одновременно.ZeroMQ: асинхронные ответы

На данный момент моя картина выглядит следующим образом:

Client -> REQ  | /\ 
Router -> ROUTER | | 
--- proxy --- | | 
Dealer -> DEALER | | 
Workers-> REP  \/--| 

Однако это требует от меня создать блокировку, синхронный работник. Единственный способ сделать это асинхронным - увеличить количество рабочих (потоков), но для меня это не очень масштабируемо.

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

void *socket = zmq_socket(context, ZMQ_REP); 
zsocket_connect(socket, "inproc://backend"); 

while (1) { 
    zmq_msg_t request; 
    zmq_msg_init(&request); 
    zmq_msg_recv(&request, socket, 0); 
    zmq_msg_close(&request); 

    do_something(callback, socket); 
} 

do_something затем выполнять некоторые операции, и когда это будет сделано, то функция обратного вызова вызывается.

void callback(void *data, void *socket) { 
    zmq_msg_t reply; 
    zmq_msg_init_size(&reply, 5); 
    memcpy(zmq_msg_data(&reply), "World", 5); 
    zmq_msg_send(&reply, socket, 0); 
    zmq_msg_close(&reply); 
} 

Теперь, есть ли способ достичь этого (т. Е. Объединить два цикла событий)?

Я уже изучал ДИЛЕР (клиент) -> ROUTER -> DEALER -> DEALER (рабочий), но это тоже не работает, поскольку он все еще блокирует параллельные задачи на стороне рабочего.

+2

Я действительно не вижу проблемы с вашей настройкой. ZMQ всегда работает асинхронно, за исключением взаимодействия с сокетами на стороне пользователя. Если вы не хотите, чтобы те блокировались, вы можете использовать неблокирующий режим и опрос для активных сокетов. – djc

ответ

2

(клиент) ДИЛЕР < -> ROUTER | < -> | ROUTER < -> ДИЛЕР (работник) В этом случае шаблон ничего не блокирует, поэтому вы можете чередовать прием и отправку, но вы хотите.

Смежные вопросы