2

このプログラムのスレッドはロックステップで動作すると予想していました。ただし、送信者は受信者が追いつくのを待つ前に最大 60000 件のメッセージを送信します。HWM について何を誤解していますか?

受信者スレッドを開始しないと、2 番目のメッセージを送信しようとしたときに送信者がブロックされます。

public static void main(String[] args) throws Exception {
    new Thread() {
        @Override
        public void run() {
            ZMQ.Context context = ZMQ.context(1);
            ZMQ.Socket socket = context.socket(ZMQ.XREP);
            socket.setHWM(1);
            socket.bind("tcp://127.0.0.1:8080");
            while (true) {
                try {
                    socket.recv(0);
                    byte[] msg = socket.recv(0);
                    System.out.println("Received: " + new String(msg, "UTF-8"));
                    Thread.sleep(1000);
                } catch (Exception ex) {
                    Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }.start();

    new Thread() {
        @Override
        public void run() {
            ZMQ.Context context = ZMQ.context(1);
            ZMQ.Socket socket = context.socket(ZMQ.XREQ);
            socket.setHWM(1);
            socket.connect("tcp://127.0.0.1:8080");
            Integer i = 1;
            while (true) {
                System.out.println("Sending: " + i);
                socket.send(i.toString().getBytes(), 0);
                i++;
            }
        }
    }.start();
}
4

1 に答える 1

2

一見、あなたと同じように思い、その振る舞いに驚きました。しかし、私はいくつかの調査を行い、答えを見つけたと思います。

ここで機能しているシステムには他のバッファがあります。最高水準点の設定は、そのうちの1つにのみ影響します。

http://www.aosabook.org/en/zeromq.html#fig.zeromq.arch

sendを呼び出すと、パイプラインにプッシュするだけで、パイプラインがネットワークを通過するのを待つことはありません。関連するI/Oスレッドは、パイプラインからネットワークにメッセージを読み取ります。小さなメッセージを送信するこのようなタイトなループにいるため、最初のメッセージが送信される前にパイプラインがいっぱいになっているように見えます。

于 2013-02-12T12:59:43.980 に答える