Это то, что я пытаюсь сделать.Я делаю удаленный вызов на сервер для информации, и я хочу заблокировать, чтобы ждать информацию.Я создал функцию, которая возвращает Deferred так, что когда RPC приходит с ответом, вызывается deferred.Затем у меня есть функция, вызванная из потока, который выходит threads.blockingCallFromThread(reactor, deferredfunc, args)
.
Если что-то пойдет не так - например, сервер отключится - тогда вызов никогда не будет разблокирован.В этих случаях я бы предпочел, чтобы отложенные сработали с исключением.
Я частично преуспел.У меня есть отложенное значение onConnectionLost
, которое отключается при потере соединения.Я изменил свою функцию блокировки вызова на:
deferred = deferredfunc(args)
self.onConnectionLost.addCallback(lambda _: deferred.errback(
failure.Failure(Exception("connection lost while getting run"))))
result = threads.blockingCallFromThread(
reactor, lambda _: deferred, None)
return result
Это прекрасно работает.Если сервер выходит из строя, соединение теряется, и запускается ошибка.Тем не менее, если сервер не выходит из строя и все отключается чисто, onConnectionLost
по-прежнему срабатывает, и анонимный обратный вызов здесь пытается вызвать ошибку, вызывая исключение AlreadyCalled
.
IsЕсть какой-нибудь аккуратный способ проверить, что отсроченный уже запущен?Я хочу не включать его в блок try/except
, но всегда могу прибегнуть к этому, если это единственный способ.