7
我正在構建一個基礎架構(C語言),其中幾個獨立的服務通過ZeroMQ進行通信。現在,爲了使這一切都快速平穩運行,我希望ZeroMQ異步運行。
我知道ZeroMQ的IO線程已經分離了,但我想同時執行多個任務。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);
}
現在,有什麼辦法可以實現這個(即組合兩個事件循環)嗎?
我已經看過DEALER(客戶端) - > ROUTER - > DEALER - > DEALER(worker),但這似乎也不起作用,因爲它仍然會阻止工作端的併發任務。
我真的沒有看到您的設置的問題。 ZMQ總是異步運行,除了用戶端與套接字的交互。如果你不想阻止這些,你可以使用非阻塞模式並輪詢可操作的套接字。 – djc 2013-03-13 10:05:38