2009-06-05 16 views
5

私はThriftでシンプルなサーバーを作成しようとしています。当初は有望そうでしたが、同時に接続された多数のクライアントに問題がありました。 TThreadPoolServerを使用しています.TThreadPoolServerを使用すると、4つのクライアントを接続してから、他のクライアントをブロックして、接続されているクライアントから1つを削除します。スレッドの数を増やすことなく、より多くの(おそらく数百の)クライアントを同時に接続できるようにするにはどうすればよいですか。私はワーカースレッドが一度に1つのクライアント要求を実行できることを前提としていましたが、閉じられるまで1つのスレッドが1つの接続を処理するように見えます。私はクライアントがアクションを実行するためにソケットを再オープンしなければならない状況を避けたいと思います。スリフトでの多数の同時接続数

答えて

3

C++を使用してサーバーを構築している場合は、アクティブなスレッドの数などにかかわらず、一度に多くの接続を受け入れることができるTThreadPoolServerの代わりにTNonblockingServerを使用できます。

実際に作業を高速化する(ハンドラはスレッドプールで実行される)ことは必ずしもできませんが、より多くのクライアントがすぐに接続できるようになります。

はここでコードがNBサーバのようになります。

shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); 
shared_ptr<MyHandler> handler(new MyHandler()); 
shared_ptr<TProcessor> processor(new MyProcessor(handler)); 
TNonblockingServer server(processor, protocolFactory, port); 
2
プール内の4つのスレッドのあなたの限界はSimpleThreadManagerのデフォルトコンストラクタに組み込まれてい

:このThreadManagerオブジェクトは、ThreadPoolServerのcoonstructorに渡されるので、このオブジェクトのコンストラクタに大きな数を渡している

class SimpleThreadManager : public ThreadManager::Impl { 

public: 
    SimpleThreadManager(size_t workerCount=4, size_t pendingTaskCountMax=0) : 
    workerCount_(workerCount), 
    pendingTaskCountMax_(pendingTaskCountMax), 
    firstTime_(true) { 
    } 
... 
}; 

スレッドプールのサイズを増やします。

+0

しかし、彼は、スレッドの数を増やしたくありません。 –

+0

おっと、私はそれを完全に逃しました:( – JackOfAllTrades

+1

あなたはpendingTaskCountMaxを増やしています、それはあなたが望むものではありませんか? – rmn

関連する問題