При использовании multiprocessing
Диспетчер объектов для создания сервера и удаленного подключения к этому серверу клиент должен поддерживать соединение с удаленным сервером.Если сервер отключается до того, как клиент выключится, он всегда будет пытаться подключиться к ожидаемому адресу сервера.
Я захожу в тупик из-за клиентского кода, пытающегося выйти после того, как сервер ушел, поскольку мой клиентский процесс никогда не завершается.
Если я del
удаленных объектов и моих клиентовДиспетчер до того, как сервер выйдет из строя, процесс завершится нормально, но удаление объекта диспетчера моего клиента и удаленных объектов сразу после использования не является идеальным.
Это лучшее, что я могу сделать?Есть ли другой (более правильный) способ отключиться от объекта удаленного менеджера?Есть ли способ чистого выхода из клиента после того, как сервер вышел из строя и / или соединение потеряно?
Я знаю, что socket.setdefaulttimeout не работает с многопроцессорной обработкой, но есть ли способ установить соединениетайм-аут для многопроцессорного модуля конкретно?Вот код, с которым у меня возникли проблемы:
from multiprocessing.managers import BaseManager
m = BaseManager(address=('my.remote.server.dns', 50000), authkey='mykey')
# this next line hangs forever if my server is not running or gets disconnected
m.connect()
ОБНОВЛЕНИЕ Это не работает в многопроцессорной среде.Тайм-аут соединения должен происходить на уровне сокета (и для этого сокет должен быть неблокирующим), но неблокирующие сокеты нарушают многопроцессорность.Невозможно справиться с отказом от установки соединения, если удаленный сервер недоступен.