【发布时间】: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
这可能是图书馆方面的僵局吗?
结束编辑
为什么会卡住? 有人可以帮我解决这个问题吗?
提前致谢。
【问题讨论】: