小编典典

如何结合callLater和addCallback?

python

这是如此破碎,希望您对我充满怜悯:

reactor.callLater(0, myFunction, parameter1).addCallback(reactor.stop)
reactor.run()

myFunction 返回延迟。

我希望很清楚我想做什么:

  • 反应堆运行后,我要立即致电myFunction。这就是为什么我使用0作为delay参数。除了callLater之外,没有其他方法吗?传递0的延迟看起来很有趣。
  • 我想在myFunction完成任务后立即停止反应堆。
    到目前为止,我遇到的问题是:

  • AttributeError: DelayedCall instance has no attribute 'addCallback'。很公平!如何在myFunction那时开始的回调链中放置回调?

  • exceptions.TypeError: stop() takes exactly 1 argument (2 given)
    为了解决第二个问题,我必须定义一个特殊函数:
def stopReactor(result):
    gd.log.info( 'Result: %s' % result)
    gd.log.info( 'Stopping reactor immediatelly' )
    reactor.stop()

并将代码更改为:

reactor.callLater(0, myFunction, parameter1).addCallback(stopReactor)
reactor.run()

(由于callLater问题仍然无法使用,但stopReactor现在可以使用)

reactor.stop除了定义一个额外的函数外,真的没有其他方法可以调用吗?


阅读 152

收藏
2021-01-20

共1个答案

小编典典

IReactorTime.callLater和Deferred由混合在一起twisted.internet.task.deferLater

from twisted.internet import reactor, task

d = task.deferLater(reactor, 0, myFunction, parameter1)
d.addCallback(lambda ignored: reactor.stop())
reactor.run()
2021-01-20