2014-09-02 27 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