【问题标题】:PyZMQ Publisher socket stuck on send_stringPyZMQ Publisher 套接字卡在 send_string 上
【发布时间】:2022-10-18 03:39:04
【问题描述】:

我正在制作一个拥有数千个订阅者的 ZMQ 应用程序,每个子节点在不同的机器上运行,ZMQ 发送卡住并且不发送任何内容,它工作的唯一方法是当发布者绑定在一个端口上时,只有连接了几个潜艇(1 或 2 个潜艇)。

我尝试使用 zmq.NOBLOCK ,但它仍然卡住了。它不仅在发送时卡住,而且还卡在任何与 ZMQ 套接字相关的调用上,例如在尝试获取事件套接字选项时(socket.getsockopt(zmq.EVENTS))。

甚至这个最小的例子也不起作用(使用python的交互式控制台)

import zmq

ctx = zmq.Context()
socket = ctx.socket(zmq.PUB)
socket.bind("tcp://*:{port}")

socket.send_string("whatever", zmq.NOBLOCK) # getting stuck here and not coming back

我也尝试过使用 C 并且它有点工作,它在第一次发送时卡住了(最多 10 分钟),下面的发送工作得很好。

C 最小示例。

void *ctx = zmq_ctx_new();
void *socket = zmq_socket(ctx, ZMQ_PUB);
zmq_bind(socket, "tcp://*:{port}");

int count = 1;
while (1) {
    if(count % 60 == 0){
        printf("Sending Message\n");
        zmq_send(socket, "whatever", 8, ZMQ_NOBLOCK);
        printf("Message Sent.\n");
    }
    count++;
    sleep (1);
}

编辑

我在 python 进程上使用 strace 时得到了这个。

futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
...
...
...
write(9, "\1\0\0\0\0\0\0\0", 8)         = 8
write(9, "\1\0\0\0\0\0\0\0", 8)         = 8
futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0

这可能是图书馆方面的僵局吗?

结束编辑

为什么会卡住? 有人可以帮我解决这个问题吗?

提前致谢。

【问题讨论】:

    标签: python zeromq pyzmq


    【解决方案1】:

    我正在使用 Python==3.8.5 和 pyzmq==19.0.2。 当我运行您的代码(没有任何订阅者)时,即使我没有设置 NOBLOCK 标志,我的代码也不会卡住。

    如果我做:

    for i in range(100):
       print(i)
       socket.send_string("whatever")
    

    它会立即打印出 0 到 99。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多