Python 多进程:远程连接管理器时的套接字错误超时
我是新来的,第一次在这里提问。
我正在使用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隧道可能不是最好的解决办法,但至少可以帮助你排除其他问题。