2013-03-09 23 views
7

私は、いくつかの別個のサービスがZeroMQを通じて通信するインフラストラクチャ(C言語)を構築しています。今、このすべてを高速でスムーズに動かすために、私は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); 
} 

ここで、2つのイベントループを組み合わせる方法はありますか?

私はすでにディーラー(クライアント) - >ルーター - >ディーラー - >ディーラー(ワーカー)を調べましたが、ワーカー側で並行タスクがブロックされているため、どちらも機能していないようです。

+2

私は本当にあなたの設定に問題が表示されません。 ZMQは、ソケットとのユーザー側の対話を除いて、常に非同期で実行されます。それらをブロックしたくない場合は、ノンブロッキングモードを使用して実行可能なソケットをポーリングすることができます。 – djc

答えて

2

(クライアント)DEALER < - > ROUTER | < - > | ROUTER < - >ディーラー(ワーカー) この接続パターンでは何もブロックされないため、受信と送信をインターリーブすることができます。

関連する問題