Я строю инфраструктуру (в 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 (рабочий), но это тоже не работает, поскольку он все еще блокирует параллельные задачи на стороне рабочего.
Я действительно не вижу проблемы с вашей настройкой. ZMQ всегда работает асинхронно, за исключением взаимодействия с сокетами на стороне пользователя. Если вы не хотите, чтобы те блокировались, вы можете использовать неблокирующий режим и опрос для активных сокетов. – djc