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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作成功完成后是否应取消Twisted超时?相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

也许最好的方法是在设置超时的同一地方向延迟添加超时取消回调。

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

以上是关于操作成功完成后是否应取消Twisted超时?的主要内容,如果未能解决你的问题,请参考以下文章

编写Twisted Client以向多个API调用发送循环GET请求并记录响应

支付宝支付成功后如何实现回调信息?

是否通过链调用 ASIO 完成处理程序以取消操作?

利用取消机制缓解后台的查询性能瓶颈

laravel安装完成后,访问public目录,显示一片空白怎么回事

等待具有超时的期货序列,而不会在 TimeoutException 上失败