Этот вопрос слишком абстрактен, чтобы дать прямой ответ. Это зависит от того, что делает ваш модуль верхнего уровня.
Однако вам следует рассмотреть возможность использования конечных точек , а не ClientFactory
. Это может решить некоторые ваши вопросы дизайна. Получение уведомлений о потере соединения немного сложнее (поскольку ClientFactory.clientConnectionLost
на самом деле является дублирующим уведомлением IProtocol.connectionLost
, его больше нет в API конечных точек; поэтому вам нужно обернуть объект IProtocol
, если вам это нужно), но это позволяет использовать более общие механизмы для повторения неудачных соединений, поскольку вместо clientConnectionFailed
вы просто получаете ошибку на Deferred
, которую вы вернули с connect
. Так, например, если все, что вы хотели сделать, это «продолжать повторное подключение до тех пор, пока вы не добьетесь успеха», вы можете использовать этот совершенно общий Deferred
-retry-loop вместо чего-то определенного для соединений, таких как ReconnectingClientFactory
:
# Warning, untested, sorry if it's broken.
@inlineCallbacks
def retry(deferredThing, delay=30.0, retryCount=5):
retries = retryCount
while True:
try:
result = yield deferredThing()
except:
if not retries:
raise
retries -= 1
log.err()
yield deferLater(reactor, delay, lambda : None)
else:
returnValue(result)
Аналогично, если бы вы могли заставить эту deferredThing
функцию возвращать Deferred
, которая сработала бы только тогда, когда логика приложения вашего протокола была завершена, в дополнение к вызову IStreamServerEndpoint.connect
, наблюдала за connectionLost
и не работала бы, если соединение был потерян до того, как интересная логика была завершена.
Deferreds
может быть эффективным способом управления этим типом асинхронного повторного попытки на нескольких уровнях системы.