Python Multiprocessing: время ожидания ошибки сокета при удаленном соединении с менеджером - PullRequest
1 голос
/ 30 марта 2011

новичок и первый в истории вопрос здесь.
Я использую многопроцессорный модуль 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

Оба компьютера могут без проблем проверять и пинговать друг друга.
Мое предположение: между ними есть один (или два!) Межсетевой экран, делающий соединение невозможным. Это правильно?
Если да: есть ли способ использовать безопасный известный порт, чтобы избежать брандмауэра или, возможно, более вежливое решение?
Если нет: что происходит?
Спасибо !!

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Использовать SSH-туннель для межсоединения?Например, на клиенте:

ssh abcd -L12345: localhost: 50000

Если клиент подключается к порту 12345 локального хоста, он должен быть туннелирован на порт 50000 abcd.

EDIT:Конечно, использование SSH-туннеля может быть не лучшим решением в производственной среде, но, по крайней мере, оно позволяет устранить другие проблемы.

0 голосов
/ 14 мая 2013

Как определено вашим фрагментом, сервер прослушивает только локальный хост (127.0.0.1), а не (a.b.c.d), поэтому вы не можете подключиться с удаленного клиента.

Для этого используйте:

manager = QueueManager(address=('a.b.c.d', 50000), authkey='abracadabra')
manager.get_server().serve_forever()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...