У меня есть клиент, подключенный к серверу с помощью Twisted. У клиента есть поток, который потенциально может делать что-то в фоновом режиме. Когда реактор останавливается, я должен:
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
deferred, и текущий doneDF
запускает обратный вызов, который делает что-то, а затем вызывает этот done
deferred..