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

问题描述 投票:2回答:1

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

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

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

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

twisted
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()
© www.soinside.com 2019 - 2024. All rights reserved.