18

http://hintjens.wdfiles.com/local--files/main:files/cc1pe.pdfを参照してください 。 Page 22 Chapter Divide and Conquer

                    Ventilator[PUSH]
        ___________________|____________________             
        |                  |                   |
[PULL]Worker[PUSH] [PULL]Worker[PUSH]  [PULL]Worker[PUSH]
        |__________________|___________________|             
                           |                   
                     [PULL]Sink
                     
// taskvent.c
    //  Socket to send messages on
    void *context = zmq_ctx_new ();
    void *sender = zmq_socket (context, ZMQ_PUSH);
    zmq_bind (sender, "tcp://*:5557");

    //  Socket to send start of batch message on
    void *sink = zmq_socket (context, ZMQ_PUSH);
    zmq_connect (sink, "tcp://localhost:5558");
                     
// taskwork.c
    //  Socket to receive messages on
    void *context = zmq_ctx_new ();
    void *receiver = zmq_socket (context, ZMQ_PULL);
    zmq_connect (receiver, "tcp://localhost:5557");

    //  Socket to send messages to
    void *sender = zmq_socket (context, ZMQ_PUSH);
    zmq_connect (sender, "tcp://localhost:5558");

// tasksink.c
    //  Prepare our context and socket
    void *context = zmq_ctx_new ();
    void *receiver = zmq_socket (context, ZMQ_PULL);
    zmq_bind (receiver, "tcp://*:5558");
    

zmq_bind または zmq_connect をいつ使用するか混乱しています。ほとんどの場合、「サーバー」は zmq_bind を使用し、「クライアント」は zmq_connect を使用します。

質問> いつ zmq_bind を使用し、いつ zmq_connect を使用する必要がありますか?

http://api.zeromq.org/

zmq_bind - accept incoming connections on a socket  
zmq_connect - create outgoing connection from socket
4

1 に答える 1

23

どちらをバインドし、どちらを接続するかについて、いくつかの基本原則があります。一般に、zeromq は気にしません*。何がより便利かはあなた次第です。

互いに通信するソケットの特定のペアについて、バインドする必要があるソケットと接続するソケットを特定するためのいくつかの質問を次に示します。

  1. プロセスの 1 つが他のプロセスよりも長く存続しますか (つまり、一方が開始し、何かを実行し、停止し、他方は長時間座って実行しますか)? もしそうなら、長命のものはバインドする必要があります。
  2. 一方または他方のインスタンスが複数ありますか? その場合、追跡する URL が少ないため、複数でないもの (またはインスタンスが少ないもの) をバインドする必要があります。

これらは主に、URL と接続の管理を容易にするためのものです。ベント/シンクの例では、人工呼吸器とシンクが 1 つずつありますが、ワーカーの数に制限はありません (0 対多)。シンクと通気口の両方が結合している場合、作業者が出入りするときに作業者について知る必要はありません。追跡する URL は 2 つだけですが、ワーカーがバインドされている場合は、新しいワーカーごとに URL を追跡し、新しいワーカーが到着するたびに新しい URL についてシンクやベントに通知する必要があります。

*実際にはいくつかのエッジケースで問題になる可能性がありますが、一般的には問題になりません.

于 2013-04-19T19:23:26.477 に答える