我有一个客户端使用扭曲连接到服务器。客户端有一个线程,它可能在后台做事。当反应堆关闭时,我必须:
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
延迟的东西。