ThreadPoolとステートマシンを備えたマルチスレッドHTTPサーバー

今日は、クライアントごとにスレッドを作成せずに、HTTPサーバーでマルチスレッドを実装するというかなり単純ですが興味深い実装について説明します。驚いたことに、そのような実装に関する情報はほとんど見つからなかったので、それをあなたと共有することにしました。問題の説明から始めましょう。





「1つのスレッド= 1つのクライアント」ソリューションの問題

以下に説明する問題は、スレッドとプロセスの両方に当てはまるため、このコンテキストでは、「1つのスレッド= 1つのクライアント」は「1つのプロセス、1つのクライアント」と見なすこともできます。





最初の問題は、プログラムで作成できるスレッドの数が制限されていることです。その結果、当社のサーバーに接続するユーザーの数も制限されます。たとえば、Apacheにはそのような問題があります。





2番目の問題は、1つのスレッドが1つのクライアントだけによって占有されていることです。この点で、リソースの非効率的な使用が発生します。(スレッドは、クライアントからのイベントを待機している間、アイドル状態になる可能性があります)





これらすべてに加えて、スレッド(またはプロセス)の作成はかなり難しい操作であり、カスタマーサービス自体よりも多くのコストが必要になる場合があることを理解する必要があります。





以下に示す解決策は、これらの問題を解決します。





解決策があります

, . ( , , , , ).





, . , , . , , .





, , . (, ) , . , . , , .





. . : readRequest, generateResponse, sendResponse closeConnection ( , , , ). . readRequest , (, , ), generateResponse, closeConnection. generateResponse sendResponse. sendResponse readRequest, closeConnection. closeConnection, , .





. ( : ) . , . readRequest - parsingRequest, .





. , , :)





. , .





ThreadPool ( )

. ( , ) .





: . , , . ( - ) , , « , », ( , ). , , , . . - .





, " = " . ( ) , ( ).





, . , , :)





, , , , , .





今回は、アプローチの本質について概説しました。すでに実用的な部分(実装へのアプローチとその落とし穴)を含む記事の続きを見ることに興味がある場合は、それについて教えてください:)





それで全部です。コメントであなたのオプション、提案、追加、批評を共有してください!読んでくれてありがとう :)





いくつかの便利なリンク:





https://habr.com/ru/post/260065/





https://habr.com/ru/company/latera/blog/273283/





http://www.aosabook.org/en/nginx.html








All Articles