NNG 是 nanomsg 唯一推荐的生产级替代品,完全重写、API 更一致、默认启用重试与心跳;pynng 是唯一活跃 Python 绑定,支持 asyncio 与同步接口;REQ/REP 迁移需严格遵循 send→recv 顺序并显式设超时。
nanomsg 已停更,NNG 是当前唯一推荐的生产级替代
nanomsg 项目自 2017 年起进入维护模式,官方明确不再接受新特性或安全更新;所有新项目应直接选用
(Nanomsg Next Generation),它不是简单升级,而是完全重写的现代通信库,API 更一致、线程模型更健壮、默认启用连接重试和心跳机制。
旧 nanomsg 的
/
在 NNG 中统一为
/
,语义更清晰,且 dialer 可单独配置重连参数(如
)
NNG 默认禁用 Nagle 算法,TCP 场景下延迟更低;nanomsg 需手动设
才能等效
nanomsg 的
在 NNG 中行为更严格:必须先
后
,否则报
—— 这是常见启动顺序错误根源
pynng 而非 nnpy:Python 用户该选哪个绑定
项目已于 2021 年归档,不再兼容 Python 3.11+,且不支持 NNG 的异步 I/O 和 TLS;
是目前唯一活跃、完整覆盖 NNG 协议族的 Python 绑定,支持
、
,也提供同步接口。
安装只需
,无需编译 nanomsg/C 依赖(它自带静态链接的 NNG)
的
写法在
中变为
—— 协议类名即语义,不用记数字常量
若你用
,直接调
/
;同步场景下
/
会自动阻塞,但注意:未设
时可能永久挂起
REQ/REP 模式迁移最容易出错的三个地方
NNG 的
/
行为比 nanomsg 更严格,尤其在超时和状态机管理上,很多“看似能跑通”的 nanomsg 代码迁过来会静默失败。
nanomsg 允许连续多次
(发多个请求),NNG 的
必须严格
→
→
,否则抛
端必须先
再
,不能反着来;而 nanomsg 对此容忍度高,容易掩盖逻辑 bug
超时必须显式设置:
(单位毫秒),否则
阻塞无上限 —— 这是服务端卡死最常见原因
跨语言互通时,协议层兼容性比 API 更关键
NNG 和 nanomsg 的 wire protocol 不兼容,但 NNG 向下兼容 nanomsg 的 *socket types*(如
/
),只要两端都用标准模式(非 raw)、不启用加密或自定义头,就能直连。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
Go 用
(nanomsg 生态)和 Python 用
的
/
可互通;但若 Go 端用了
(NNG 兼容版),Python 端就必须用
,不能混用
消息体必须是裸字节流;JSON 或 Protobuf 需自行序列化,NNG 不做任何编码转换 —— 别指望
能自动转成字节
TCP 地址写法要一致:
可以,
在某些系统 DNS 解析慢会导致连接超时,建议统一用 IP
真正麻烦的从来不是换库,而是旧代码里那些没显式处理超时、没检查返回值、靠运气跑通的 socket 交互逻辑。NNG 把这些“运气”全拿掉了,换来的不是额外工作量,是上线后少查三次凌晨三点的连接中断告警。
nngnn_bind()nn_connect()listen()dial()reconnect_time_minNN_TCPNODELAYinproc://listen()dial()nng.EINVALnnpypynngasynciotriopip install pynngnnpySocket(nnpy.AF_SP, nnpy.PUB)pynngPub0()asyncioasend()arecv()send()recv()recv_timeoutReq0Rep0send()Req0send()recv()send()nng.ESTATERep0recv()send()recv_timeout=5000recv()PUBSUBmangospynngPub0Sub0mangos/v3pynngnnpysend({"a":1})tcp://127.0.0.1:5555tcp://localhost:5555