操作成功完成后是否应取消Twisted超时?

时间:2013-08-12 16:49:06

标签: twisted

对于处理在超时到期之前成功完成的Twisted操作设置的超时,建议的做法是什么?

超时是否应该继续运行并取决于Deferred.cancel()方法对已完成的延期没有影响?

或者在操作完成时明确取消超时是否更好?

第二个选项似乎更清晰,但需要更复杂且容易出错的代码(很容易留下正在运行的计时器,特别是对于需要多个步骤的操作)。

1 个答案:

答案 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()