2011-02-02 25 views
5

我正在開發Twisted中的網絡應用程序,其中的一部分包含用Django編寫的Web界面。Twisted:創建一個ThreadPool,然後守護進程導致無信息掛起

我希望使用Twisted的WSGI服務器來託管Web界面,並且我已經編寫了一個工作「輕擊」插件,以允許我使用twistd

當運行與服務器的-n標誌(不守護進程)一切工作正常,但是當這個標誌被刪除的服務器不要求任何響應,並且沒有記錄的消息(雖然服務器仍在運行)。

有一個bug on Twisted's Trac這似乎是完全描述問題,我的插件恰好是基於code referenced in the ticket

不幸的是,這個問題還沒有解決 - 它在一年前就已經提出了。

我試圖創建一個ThreadPoolService類,它擴展Service並開始給定ThreadPoolstartService叫做:

class ThreadPoolService(service.Service): 
    def __init__(self, pool): 
     self.pool = pool 

    def startService(self): 
     super(ThreadPoolService, self).startService() 
     self.pool.start() 

    def stopService(self): 
     super(ThreadPoolService, self).stopService() 
     self.pool.stop() 

然而,扭曲似乎並沒有在所有調用startService方法。我認爲問題在於,使用「輕擊」插件時,ServiceMaker只能返回一個要啓動的服務 - 並且不啓動屬於同一應用程序的任何其他服務。顯然,我返回一個包含WSGI根的TCPServer服務。

在這一點上,我碰到了一些磚牆。有沒有人有任何想法可以解決這個問題?

回答

7

從您的ServiceMaker返回MultiService;一個包括您的ThreadPoolService以及您的主要應用程序服務。組裝這樣的事情的API是非常簡單的:

multi = MultiService() 
mine = TCPServer(...) # your existing application service 
threads = ThreadPoolService() 
mine.setServiceParent(multi) 
threads.setServiceParent(multi) 
return multi 

既然你已經找到了應對之內扭轉這種困惑的問題票,我期待着看到你的補丁:)。

+0

這是完美的。我不知道爲什麼我沒有在文檔中看到它,但它的作用像一個魅力。謝謝! – 2011-02-02 19:15:57