ツイストを使用してクライアントをサーバーに接続しています。クライアントには、バックグラウンドで実行している可能性のあるスレッドがあります。原子炉が停止するとき、私は次のことをしなければなりません:
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 を作成し、現在のコールバックを起動して、処理を実行してからdeferreddoneDF
を呼び出す必要があります。done