2010-11-02 106 views
3

我剝了下來我的應用程序,但是這應該給你的我做Python的扭曲與callInThread

def run_app(f): 
    p = Popen(['/usr/bin/app'],stdout=PIPE) 
    while True: 
     o = p.stdout.readline() 
     if o == '' and p.poll() != None: break 

     reactor.callFromThread(f, o) 

class Echo(Protocol): 
    def connectionMade(self): 

     reactor.callInThread(run_app, self.appDataReceived) 

    def dataReceived(self, data): 
     data = data.strip() 
     if data == "getmore": 
      print "getmore" 

    def appDataReceived(self, u): 
     print u 

def main(): 
    factory = Factory() 
    factory.protocol = Echo 
    reactor.listenTCP(3646, factory) 
    reactor.run() 

if __name__ == "__main__": 
    main() 

我有什麼,我想在連接和運行一個應用程序,不斷地吐出了一個應用程序的例子數據到標準輸出。現在我的應用程序可以工作,但問題是當客戶端退出套接字連接時,/ usr/bin/app仍然繼續運行。更多的套接字連接使得這個應用程序仍在運行。

無論如何Echo Procool殺死run_app()函數?

+0

你可以檢查是否滿足條件:if o ==''and p.poll()!= None:break – pyfunc 2010-11-02 21:03:44

回答

1

有幾個建議,我可以做,並希望它可以解決您的問題。

不要使用reactor.callFromThread,而是使用deferToThread

from twisted.internet.threads import deferToThread 
deferredObj = threads.deferToThread(run_app, self.appDataReceived) 

就像你啓動線程的連接時。您需要在連接丟失時採取行動。

示例代碼:

class Echo(Protocol): 
    def connectionLost(self, reason): 
     print reason 
     # which is crude, there should be a more elegant answer 
     reactor.stop() 

一致認爲deferToThread爲短期運行任務進行了優化。實際上,最好重新執行代碼,以便可以調用線程來運行進程並返回結果。