2014-09-02 50 views
0

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

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。

+0

请填写更多详细信息...也许会很高兴为MyFactory和MyConnector放置代码? – spinus 2014-09-02 13:57:16

回答

1

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

要将此应用于您的示例中,您需要拨打LoopingCall(factory.sanitize())并将返回值传递给LoopingCall

这很可能不是你的意思。相反,你可能打算通过factory.sanitize作为参数LoopingCall。如果您想LoopingCall定期拨打factory.sanitize,这就是您需要做的事情。我只是猜测这就是你想要的 - 你没有明确地说出你想要的问题。 :)

+0

你是完全正确的。这个问题实际上与Twisted无关。相应的行应该是 'sanitizing = task.LoopingCall(factory.sanitize)' – t2d 2014-09-02 14:35:56