对于处理在超时到期之前成功完成的Twisted操作设置的超时,建议的做法是什么?
超时是否应该继续运行并取决于Deferred.cancel()
方法对已完成的延期没有影响?
或者在操作完成时明确取消超时是否更好?
第二个选项似乎更清晰,但需要更复杂且容易出错的代码(很容易留下正在运行的计时器,特别是对于需要多个步骤的操作)。
答案 0 :(得分:4)
也许最好的方法是在设置超时的同一地方为延迟添加超时取消回调。
from twisted.internet import reactor, task
def foo():
return 'done'
def somethingPossiblyCanceled():
return task.deferLater(reactor, 1, foo)
def addTimeout(d, duration):
timeout = reactor.callLater(duration, d.cancel)
def cancelTimeout(result):
if timeout.active():
timeout.cancel()
print('(timeout canceled)')
return result
d.addBoth(cancelTimeout)
def main():
d = somethingPossiblyCanceled()
addTimeout(d, 2)
def finished(result):
print(result)
reactor.stop()
def canceled(failure):
print('timed out: {0}'.format(failure))
reactor.stop()
d.addCallbacks(finished, canceled)
reactor.callWhenRunning(main)
reactor.run()