2011-02-02 1 views
5

Twistedでネットワークアプリケーションを開発しています。その一部はDjangoで書かれたWebインターフェイスで構成されています。Twisted:ThreadPoolを作成してデーモン化すると情報がないハングにつながる

TwistedのWSGIサーバーを使用してWebインターフェイスをホストしたいと思っています。twistdを使用できるようにするために、「タップ」プラグインを作成しました。

-nフラグ(デーモン化しないでください)でサーバを実行すると、すべて正常に動作しますが、このフラグが削除されると、サーバは要求に全く応答せず、メッセージも記録されませんまだ実行されています)。

bug on Twisted's Tracが問題を正確に記述しているようですが、私のプラグインはcode referenced in the ticketに基づいています。

残念ながら、この問題は修正されておらず、ほぼ1年前に発生しました。

私は Serviceを拡張し、 startServiceが呼ばれる特定の ThreadPoolを開始 ThreadPoolServiceクラス、作成しようとしました

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のサービスを1つだけ返すことができると考えています。サービスが開始されていて、同じアプリケーションに属する他のサービスは起動していません。明らかに、私は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

これは完璧です。私はなぜドキュメンテーションでそれを見ていないのかわかりませんが、それは魅力のように機能します。ありがとうございました! –

関連する問題