2

私は、1 つのソース (ファイル、ソケットなど) から何かを読み取り、多くのクライアントで処理および書き込みを行う必要がある小さなプロジェクトで作業しています (新しいクライアントごとに異なります)。

select を使用して I/O を多重化しています。

ソースを読み取れる場合は、内部バッファーに格納し、処理して、多くの出力バッファー (クライアントごとに 1 つ) に書き込みます。can_write の場合は、バッファを書き込むだけです。いいですね。

しかし、これを多数のユーザーに合わせて拡張するにはどうすればよいでしょうか? フォークを使用して、プロセスごとにx接続のようなものを設定することを考えていました。それが良い方法なのか、それともプリフォークまたは別のポートで作業してロードバランスを使用する方が良いのかは本当にわかりませんが、今のところ、フォーク+選択をどのように処理できるかは明確ではありません

たとえば、プロセスごとに 100 クライアントで作業する場合、101 番目のクライアントでフォークしますが、メモリには古い選択クライアントと 100 ソケット クライアントが残っています。「古い」選択を消去して新しい選択を開始できますが、奇妙です。自分の戦略で十分かどうかはわかりません。

4

4 に答える 4

2

通常、これは「プリフォーク」技術で行われます。これは次のように機能します。

1)リスニングソケットを作成します

2)fork()N人の労働者を作る

3)各ワーカーがaccept()クライアントを開始します(ほとんどの無料ワーカーが仕事を引き受けます)。一方、「親」プロセスは「マネージャー」とwaitpid()その子になり、「ワーカー」の数がN未満の場合はフォークします。

ただし、この方法では、「ワーカー」間でデータを送信できません(他のプロセスの101番目のクライアントの最初の場合のように)。したがって、この設計はニーズに合わない可能性があります。この場合、AnyEventCPANモジュールを使用したいと思います。これにより、多重化にepoll / kqueueを使用し、1つのsignleプロセスで数千の接続にスケーラブルであるため(スクリプトがCPUに負荷をかけない場合)、一度に多くのクライアントと非同期で作業できます。

于 2012-11-29T14:55:36.107 に答える
1

フレームワークを中心にアプリケーションを作成することに抵抗がない場合は、CPAN 上のかなり由緒ある受賞歴のあるマルチタスク/ネットワークフレームワークPOEをお勧めします。

基本的には、カーネルとイベント ループを提供しますselect(単純化しすぎています)。コールバックを記述します。xイベントが起きたらやるeとか、そういうこと。ソケット、ファイル、端末のいずれであるかに関係なく、複数のソースに対して同時に読み取り/書き込みを行うのに理想的です。慣れが必要ですが、とても便利です。良い例がたくさんあります。

たとえば、プロセスのプールを事前にフォークしてスケーリングしたい場合、POE はそれを簡単に管理するための何かを提供します: http://metacpan.org/pod/POE::Wheel::Run

また、同時クライアントを処理する TCP サーバーが必要な場合は、http: //metacpan.org/pod/POE ::Component::Server::TCP があります。

スレッドを使用しないことに注意してください。これは、イベント ループとコールバックを使用した協調マルチタスクの形式です。リクエストごとに実行する必要がある処理にかかる時間がごくわずかである場合は、それだけで十分ですが、ブロックする可能性のある作業を事前にフォークされたプロセスのプールに委任したい場合は、POE::Wheel::Run.

于 2012-11-29T15:21:18.043 に答える
0

これに対する通常のアプローチは、いくつかのワーカー プロセスを事前にフォークしてから、新しく受け入れたクライアント ソケットのファイル記述子をラウンドロビン方式などで渡して、UNIX ドメイン ソケットを介してさらに処理することです。

于 2012-11-29T14:55:24.393 に答える
0

あなたの要件を正しく理解しているかどうかはよくわかりませんが、1 つのソースから入力を取得し、出力を複数のソースにコピーする場合は、ZeroMQ のような PubSub システムを検討することをお勧めします。http://zeromq.org/およびhttps://metacpan.org/module/ZMQを参照してください。

これは、クライアントとサーバー間の特定のプロトコルに拘束されていないことを前提としています。

于 2012-11-29T15:18:59.537 に答える