如何组合callLater和addCallback?

dan*_*ast 10 python twisted

这太破碎了,我希望你对我很仁慈:

reactor.callLater(0, myFunction, parameter1).addCallback(reactor.stop)
reactor.run()
Run Code Online (Sandbox Code Playgroud)

myFunction 返回延迟.

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

  • 一旦反应堆运行,我想打电话myFunction.这就是我使用0作为延迟参数的原因.除了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()
Run Code Online (Sandbox Code Playgroud)

并将代码更改为:

reactor.callLater(0, myFunction, parameter1).addCallback(stopReactor)
reactor.run()
Run Code Online (Sandbox Code Playgroud)

(由于callLater问题仍无法正常工作,但stopReactor现在可以正常工作)

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

Jea*_*one 21

IReactorTime.callLaterDeferred混合在一起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()
Run Code Online (Sandbox Code Playgroud)

  • 使用参数调用Deferred上的回调.`reactor.stop`不接受任何参数.`lambda被忽略:reactor.stop()`接受和参数,忽略它,并且在没有参数的情况下调用`reactor.stop`. (4认同)
  • 写一下会更常规:'lambda _:reactor.stop' (4认同)