2

处理为在超时到期之前成功完成的 Twisted 操作设置的超时的推荐做法是什么?

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

还是在操作完成时显式取消超时更好?

第二个选项看起来更简洁,但需要更复杂且容易出错的代码(很容易留下一个正在运行的计时器,特别是对于需要几个步骤的操作)。

4

1 回答 1

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()
于 2013-08-12T19:47:00.220 回答