2013-03-09 101 views
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),但這似乎也不起作用,因爲它仍然會阻止工作端的併發任務。

+2

我真的沒有看到您的設置的問題。 ZMQ總是異步運行,除了用戶端與套接字的交互。如果你不想阻止這些,你可以使用非阻塞模式並輪詢可操作的套接字。 – djc 2013-03-13 10:05:38

回答

2

(客戶)經銷商< - > ROUTER | < - > |路由器< - >經銷商(工作人員) 在這種連接模式下,什麼都不會阻塞,因此您可以交叉接收和發送您想要的。