У меня есть клиент, подключенный к серверу с использованием витой.У клиента есть поток, который потенциально может делать вещи в фоновом режиме.Когда реактор закрывается, я должен:
1) check if the thread is doing things
2) stop it if it is
Какой элегантный способ сделать это?Лучшее, что я могу сделать, - это какая-то запутанная вещь, например:
def cleanup(self):
isWorkingDF = defer.Deferred()
doneDF = defer.Deferred()
def checkIsWorking():
res = self.stuff.isWorking() #blocking call
reactor.callFromThread(isWorkingDF.callback, res)
def shutdownOrNot(isWorking):
if isWorking:
#shutdown necessary, shutdown is also a blocking call
def shutdown():
self.stuff.shutdown()
reactor.callFromThread(doneDF, None)
reactor.callInThread(shutdown)
else:
doneDF.callback(None) #no shutdown needed
isWorkingDF.addCallback(shutdownOrNot)
reactor.callInThread(checkIsWorking)
return doneDF
Сначала мы проверим, работает ли она вообще.Результат этого обратного вызова переходит в rescallback
, который либо выключается, либо не срабатывает, а затем запускает doneDF, который искажается и ждет закрытия.
Довольно испортился, а!Есть ли способ лучше?
Может быть, связанный с этим вопрос, есть ли более элегантный способ связать обратные вызовы друг с другом?Я мог видеть, что мне нужно сделать больше кода для очистки после того, как это будет сделано, так что тогда мне придется сделать другой done
отложенный, и заставить текущий doneDF
вызвать обратный вызов, который делает вещи, затем вызывает, что done
отложил..