You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyZMQ发布者Socket调用send_string时阻塞问题求助

ZMQ发布者send操作阻塞问题排查

我正在开发一个包含数千个分布在不同机器上订阅者的ZMQ应用,目前遇到严重的send阻塞问题:只有当发布者绑定的端口仅连接1-2个订阅者时才能正常发送,否则send操作完全无法执行。

尝试添加zmq.NOBLOCK参数后依然阻塞,而且不只是send操作,所有ZMQ Socket相关调用都会卡住——比如调用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) # 此处卡住无法返回

C语言最小复现示例

情况略有不同:第一次send会阻塞长达10分钟,后续send则正常工作。

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);
}

补充信息:strace输出

对Python进程执行strace后,得到重复的futex调用输出:

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

这是否可能是库层面的死锁问题?请问出现阻塞的原因是什么?恳请帮忙排查此问题。


内容的提问来源于stack exchange,提问作者ALG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:16:04