Python 多进程:远程连接管理器时的套接字错误超时

2 投票
2 回答
3440 浏览
提问于 2025-04-16 14:41

我是新来的,第一次在这里提问。
我正在使用Python的多进程模块,目前在我的本地电脑上创建了一个管理器和大约45个进程。我的管理器设置如下:

manager = QueueManager(address=('', 50000), authkey='abracadabra')
manager.get_server().serve_forever()

我还想在另一台电脑上远程创建一些客户端进程。假设我的IP是a.b.c.d,远程电脑上的客户端管理器设置如下:

manager = QueueManager(address=('a.b.c.d', 50000), authkey='abracadabra')
manager.connect()

(是的,这段代码是从文档中复制过来的)。
不过,我在本地运行服务器和所有45个进程都没问题,然后我运行远程客户端时却出现了这个:

Traceback (most recent call last):
  File "govmap-parallel-crawler-client.py", line 144, in <module>
    manager.connect()
  File "/usr/lib/python2.6/multiprocessing/managers.py", line 474, in connect
    conn = Client(self._address, authkey=self._authkey)
  File "/usr/lib/python2.6/multiprocessing/connection.py", line 134, in Client
    c = SocketClient(address)
  File "/usr/lib/python2.6/multiprocessing/connection.py", line 252, in SocketClient
    s.connect(address)
  File "<string>", line 1, in connect
socket.error: [Errno 110] Connection timed out

两台电脑之间可以互相ping和ssh,没有问题。
我猜:中间可能有一个(或两个!)防火墙导致连接不成功。这对吗?
如果是:有没有办法使用一个安全的已知端口来避开防火墙,或者有没有更温和的解决方案?
如果不是:那到底发生了什么?
谢谢!!

2 个回答

1

根据你提供的代码,服务器只在本地(127.0.0.1)监听,而不是在其他地址(比如a.b.c.d),所以你无法从远程客户端连接到这个服务器。

如果想要实现远程连接,可以使用:

manager = QueueManager(address=('a.b.c.d', 50000), authkey='abracadabra')
manager.get_server().serve_forever()
2

用SSH隧道来连接吗?比如在客户端:

ssh a.b.c.d -L12345:localhost:50000

如果客户端连接到本地的12345端口,它就会通过隧道连接到a.b.c.d的50000端口。

补充一下:当然,在实际生产环境中,使用SSH隧道可能不是最好的解决办法,但至少可以帮助你排除其他问题。

撰写回答