それは本当に質問ではありません。私はいくつかのガイドラインを探しているだけです:)私は現在、可能な限り少ない数のスレッドを使用する必要がある抽象tcpサーバーを作成しています。
現在、この方法で動作しています。リスニングを行うスレッドといくつかのワーカー スレッドがあります。リスナー スレッドはただ座ってクライアントが接続するのを待ちます。サーバー インスタンスごとに 1 つのリスナー スレッドがあると予想されます。ワーカー スレッドは、クライアント ソケットですべての読み取り/書き込み/処理ジョブを実行しています。
だから私の問題は、効率的なワーカープロセスを構築することです。そして、私はまだ本当に解決できない問題に直面しました。ワーカーコードは次のようなものです(コードは、私が問題を抱えている場所を示すためだけに非常に単純です):
List<Socket> readSockets = new List<Socket>();
List<Socket> writeSockets = new List<Socket>();
List<Socket> errorSockets = new List<Socket>();
while( true ){
Socket.Select( readSockets, writeSockets, errorSockets, 10 );
foreach( readSocket in readSockets ){
// do reading here
}
foreach( writeSocket in writeSockets ){
// do writing here
}
// POINT2 and here's the problem i will describe below
}
whileループが何度も繰り返されるため、CPU使用率が100%であっても問題なく動作します。クライアントがsend->receive->disconnectルーチンを実行している場合、それほど苦痛ではありませんが、send->を実行して生き続けようとするとreceive->send->receive を繰り返すと、実際にすべての CPU が消費されます。だから私の最初のアイデアはそこにスリープを置くことでした.すべてのソケットにデータが送信されているかどうかを確認し、Thread.Sleep を POINT2 に 10 ミリ秒だけ入れますが、この 10 ミリ秒後に、次に受信したいときにその 10 ミリ秒の大きな遅延が発生しますクライアント ソケットからのコマンド。
多分それは単に貧弱なアーキテクチャですか?プロセッサーの使用率が 100% にならないようにするにはどうすればよいでしょうか。また、サーバーがクライアント ソケットに表示される何かにできるだけ早く反応するようにするにはどうすればよいでしょうか? たぶん誰かがノンブロッキングサーバーとそれが維持すべきアーキテクチャの良い例を指摘できますか?