Python multiprocessing BaseManager本地正常远程连接报EOFError
问题原因
跨主机连接抛出EOFError、同机访问正常的核心原因是服务端BaseManager的监听地址配置错误:
- 服务端代码中绑定的
127.0.0.1是本地回环地址,仅允许本机进程访问,发往该地址的流量不会经过物理网卡,外部主机的连接请求无法送达Manager进程。 - 跨主机访问时,TCP连接会被操作系统直接重置,客户端在认证握手阶段等待服务端返回挑战消息时读不到任何数据,就会触发
EOFError,和认证密钥配置无关。
修复方案
- 调整服务端监听地址:将初始化Manager时的绑定地址从
127.0.0.1改为0.0.0.0,监听所有网卡的60000端口,允许外部主机发起连接;如果有访问范围限制需求,也可以直接绑定服务端对外提供服务的指定内网/公网IP。
修改后的服务端核心代码如下:
from multiprocessing.managers import BaseManager password = "password".encode("utf-8") class MyManager(BaseManager): pass a = {'one': 1} # 待对外暴露的共享对象 MyManager.register("get_a", callable=lambda: a) m = MyManager(address=("0.0.0.0", 60000), authkey=password) m.start() # ... 长驻运行逻辑 ...
- 排查网络链路:确认服务端主机的本地防火墙、云平台安全组规则已经放行了60000端口的TCP入站流量,同时核对客户端代码中填写的
SERVER_IP是服务端实际对外可达的IP,无地址填写错误。
调试时可以先在客户端执行telnet SERVER_IP 60000验证端口连通性,TCP链路通了之后再运行客户端代码,能减少不必要的排错成本。
内容的提问来源于stack exchange,提问作者Mo Kanj
相关产品推荐
相关产品推荐

