如何为Twisted ServerFactory启动任务?

时间:2014-09-02 13:41:34

标签: python task twisted factory

我有一个Twisted ServerFactory,我从listenTCP开始。如何启动与该工厂相关的任务? 我试过了:

if __name__ == "__main__":
    factory = MyFactory()
    reactor.listenTCP(555558, factory)
    reactor.connectTCP("127.0.0.1", 55555, MyConnector(factory))

    sanitizing = task.LoopingCall(factory.sanitize())
    sanitizing.start(3, False)

    reactor.run()

但这会引发错误:

Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1192, in run self.mainLoop()
  File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1201, in mainLoop
    self.runUntilCurrent()
  File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 824, in        runUntilCurrent
    call.func(*call.args, **call.kw)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/task.py", line 218, in __call__
    d = defer.maybeDeferred(self.f, *self.a, **self.kw)
--- <exception caught here> ---
  File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 139, in maybeDeferred
    result = f(*args, **kw)
exceptions.TypeError: 'NoneType' object is not callable

工厂实际上在听,所以我不明白为什么它是NoneType。

1 个答案:

答案 0 :(得分:1)

在Python中,name()是调用对象(通常是函数或方法)的语法。通过扩展,name(another_name())是您调用对象的方式(由名称another_name引用),然后将该调用的返回值传递给另一个对象(由名称name引用)。 / p>

要将此应用于您的示例,LoopingCall(factory.sanitize())是您致电factory.sanitize并将返回值传递给LoopingCall的方式。

这很可能不是你的意思。相反,您可能打算将factory.sanitize作为参数传递给LoopingCall。如果您希望LoopingCall定期调用factory.sanitize,则需要执行此操作。我只是猜测这就是你想要的 - 你实际上没有在你的问题中明确说出你想要的东西。 :)