首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jzmq似乎忽略了XREP上的HWM

jzmq似乎忽略了XREP上的HWM
EN

Stack Overflow用户
提问于 2013-02-09 18:28:58
回答 1查看 215关注 0票数 2

我期望这个程序中的线程能以锁步的方式工作。然而,发送者在等待接收者赶上之前发送了大约60000条消息。我对HWM有什么误解?

如果我没有启动接收方线程,那么发送方会在尝试发送第二条消息时阻塞。

代码语言:javascript
运行
复制
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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-12 20:59:44

乍一看,我和你有同样的想法,并对这种行为感到惊讶。但我做了一些研究,我想我找到了答案。

在这里,系统中还有其他缓冲区在起作用。设置高水位线只会影响其中一个。

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

调用send只是将其推送到管道,而不是等待它通过网络。关联的I/O线程将消息从流水线读取到网络上。由于您处于发送小消息的紧密循环中,因此在发送第一条消息之前,您似乎已经填满了流水线。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14787152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档