1

HTTP リクエストを処理する QT で単純な Web サーバーを作成しようとしています。QT には QThreads があることを知っており、同時接続の処理に使用できます。私が望むのは、マスターからワーカーへのリクエストの負荷の大部分を渡すことができるように、少なくとも 2 つのワーカー プロセスを用意することです。問題は、マスターがポート 80 でリッスンしていて、着信接続があるときに「受け入れ」を行うことです。着信接続を受け入れるワーカーのコードをどのように記述すればよいですか? ワーカー プロセスは、マスターがポート 80 にバインドするのと同じポートでリッスンできません。

NGinx と LigHTTPD にはワーカー プロセスがあり、ポート 80 でリッスンするのはマスターだけであることは知っています。どうすればよいか、または NGINX または Lighttpd でこれを実装する方法を教えてください。

4

2 に答える 2

2

次の 2 つの選択肢があります。

  • マスター プロセスはソケット上の接続を受け入れませんが、ワーカーは受け入れます。接続が入ると、accept()ランダムにいずれかのワーカーによって接続されます。accept()ブロックされているワーカーのどれがそれを受け取るかを制御することはできません。
  • マスター プロセスのみが接続を受け入れます。sendmsg()次に、マスター プロセスはwithを使用して、受け入れた接続を別のソケット経由でワーカーにディスパッチしSCM_RIGHTSます。socketpair()これを達成するために、マスターと各ワーカーの間に 1 つずつ、多数の を配置できます。

ワーカー プロセスではなくワーカー スレッドを使用してSCM_RIGHTSいる場合は、ワーカー スレッドでファイル記述子が既に有効であるため、ソケット トリックを使用して受け入れられた接続をワーカーに送信する必要はありません (別のファイル記述子名前空間はありません)。単一プロセスの個別のスレッド用)。この場合、セマフォやキューなどの単純なシグナリングを使用して、新しい接続を取得する必要があることをワーカーに知らせることができます。

于 2013-05-26T14:22:27.173 に答える
0

私が行う方法は、QThread 自体から派生した FortuneThread クラスがないことを除いて、 Threaded Fortune Cookie の例に似ています。QRunnableから派生させてから、QThreadPoolに渡したいと思います。

このようにして、システムで実行されているアクティブなスレッドの数に制限を設けることができ、常にスレッドの作成と破棄を続ける必要はありません。スレッド プールがしばらくアイドル状態になるまでスレッドを再利用するだけです。

于 2013-05-26T19:06:45.553 に答える