Thriftを使用して単純なサーバーを作成しようとしています。最初は有望に見えましたが、同時に接続されている多数のクライアントで問題が発生しました。私はTThreadPoolServerを使用しています。これにより、4つのクライアントが接続できるようになり、接続されているクライアントから1つを強制終了するまで他のクライアントがブロックされます。スレッドの数を増やすことなく、より多くの(場合によっては数百の)クライアントを同時に接続できるようにするにはどうすればよいですか。ワーカースレッドは一度に1つのクライアント要求を実行できると想定しましたが、閉じられるまで1つのスレッドが1つの接続を処理するように見えます。クライアントがアクションを実行するためにソケットを再度開く必要がある状況を回避したいと思います。
6534 次
2 に答える
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);
于 2010-06-18T07:51:17.830 に答える
2
プール内の4つのスレッドの制限は、SimpleThreadManagerのデフォルトコンストラクターに組み込まれています。
class SimpleThreadManager : public ThreadManager::Impl {
public:
SimpleThreadManager(size_t workerCount=4, size_t pendingTaskCountMax=0) :
workerCount_(workerCount),
pendingTaskCountMax_(pendingTaskCountMax),
firstTime_(true) {
}
...
};
このThreadManagerオブジェクトはThreadPoolServercoonstructorに渡されるため、このオブジェクトのコンストラクターに大きな数値を渡して、スレッドプールのサイズを増やします。
于 2009-06-24T21:58:10.963 に答える