クラスタNode.js のイベント ループやイベント レスポンス プロセッサはシングル スレッドであることはわかっていますが、最近の CPU は基本的にマルチコアです。最新の CPU のマルチコア特性を最大限に活用するには、複数の子プロセスが同じサーバー ポートを共有できるようにクラスターを作成します。 つまり、クラスターを通じて、複数の子プロセスを使用して同じポートの要求を処理できます。 http サーバーでクラスターを使用する簡単な例を見てみましょう。 定数cluster = require('cluster'); 定数 http = require('http'); 定数numCPUs = require('os').cpus().length; クラスタがマスターの場合 console.log(`メインプロセス ${process.pid} が実行中です`); // ワーカープロセスを生成します。 (i = 0; i < numCPUs; i++) の場合 { クラスターをフォークします。 } cluster.on('exit', (ワーカー、コード、シグナル) => { console.log(`ワーカープロセス ${worker.process.pid} が終了しました`); }); } それ以外 { // ワーカープロセスは任意の TCP 接続を共有できます。 // この例では、HTTP サーバーが共有されます。 http.createServer((req, res) => { 書き込みヘッドを200にします。 res.end('Hello World\n'); }).listen(8000); console.log(`ワーカープロセス ${process.pid} が開始されました`); } クラスターの詳細クラスター モジュールは lib/cluster.js から派生しています。cluster.fork() を使用して、メイン プロセスからのリクエストを処理する子ワーカー プロセスを作成できます。 クラスター内のイベントクラスターは events.EventEmitter を継承するため、クラスターはイベントを送受信できます。 クラスターは、切断、終了、フォーク、リスニング、メッセージ、オンライン、セットアップの 7 つのイベントをサポートします。 切断について説明する前に、まず IPC という概念を紹介します。IPC の正式名称は Inter-Process Communication で、プロセス間通信を意味します。 IPC は主にメインプロセスとサブプロセス間の通信に使用されます。ワーカー プロセスは、作成後に自動的にマスター プロセスに接続します。 「disconnect」イベントが発行されると、接続は切断されます。 切断イベントをトリガーする理由は多数ありますが、worker.disconnect() へのアクティブな呼び出しや、ワーカー プロセスの終了または強制終了などが考えられます。 cluster.on('切断', (ワーカー) => { console.log(`ワーカープロセス #${worker.id} が切断されました`); }); いずれかのワーカー プロセスが閉じられると、終了イベントがトリガーされます。これは通常、クラスター内のプロセスが異常終了するかどうかを監視するために使用されます。プロセスが終了した場合は、cluster.fork を使用して新しいプロセスを作成し、リクエストを処理するのに十分なプロセスがあることを確認します。 cluster.on('exit', (ワーカー、コード、シグナル) => { console.log('作業プロセス %d が終了しました (%s)。再起動しています...', worker.process.pid、シグナル || コード); クラスターをフォークします。 }); cluster.fork メソッドが呼び出されると、フォーク イベントがトリガーされます。 const タイムアウト = []; 関数 errorMsg() { console.error('接続エラー'); } cluster.on('fork', (ワーカー) => { タイムアウト[worker.id] = setTimeout(errorMsg, 2000); }); ワーカー プロセスが listen メソッドを呼び出すと、メイン プロセスとワーカー プロセスのリスニング イベントがトリガーされます。 cluster.on('listening', (ワーカー, アドレス) => { コンソール.log( `ワーカープロセスが ${address.address}:${address.port} に接続されました`); }); Worker は作業スレッドを表し、address には address、port、addressType の 3 つの属性が含まれます。 addressType には 4 つのオプション値があります。
メインプロセスが子プロセスから送信されたメッセージを受信したときに、メッセージ イベントがトリガーされます。 メインプロセスがワーカープロセスを生成すると、フォークがトリガーされ、ワーカープロセスが実行されると、オンラインがトリガーされます。 setupMaster メソッドが呼び出されると、セットアップ イベントがトリガーされます。 クラスター内のメソッドクラスターには、disconnect、fork、setupMaster という 3 つのメソッドがあります。 cluster.disconnect([コールバック]) クラスターの切断メソッドを呼び出すと、実際にはクラスター内の各ワーカーの切断メソッドが呼び出されます。これにより、ワーカーはメイン プロセスから切断されます。 すべてのワーカーが切断されると、コールバックが実行されます。 クラスター.fork([env]) fork メソッドは、メイン プロセスから新しい子プロセスを作成します。 env は、プロセス環境変数に追加されるキーと値のペアです。 fork はワーカー プロセスを表す cluster.Worker オブジェクトを返します。 最後のメソッドはsetupMasterです。 クラスター.setupMaster([設定]) デフォルトでは、クラスターは fork メソッドを使用して子プロセスを作成しますが、setupMaster を使用してこの動作を変更できます。設定変数を設定することで、後続のフォーク子プロセスの動作を変更できます。 setupMaster の例を見てみましょう。 定数cluster = require('cluster'); クラスター.setupMaster({ 実行: 'worker.js', 引数: ['--use', 'https'], サイレント: 真 }); cluster.fork(); // https ワーカープロセス cluster.setupMaster({ 実行: 'worker.js', 引数: ['--use', 'http'] }); cluster.fork(); // http ワーカープロセス クラスター内の属性クラスター オブジェクトを通じて、isMaster と isWorker を使用して、プロセスがメイン プロセスであるかどうかを判断できます。 現在のワーカー プロセス オブジェクトへの参照は、worker を通じて取得できます。 定数cluster = require('cluster'); クラスタがマスターの場合 console.log('これがメインプロセスです'); クラスターをフォークします。 クラスターをフォークします。 } そうでない場合 (cluster.isWorker) { console.log(`これはワーカープロセス#${cluster.worker.id}です`); } アクティブなワーカー プロセス オブジェクトをワーカーを通じて走査できます。 // すべてのワーカー プロセスを反復処理します。 関数 eachWorker(コールバック) { (cluster.workers 内の定数 id) { コールバック(cluster.workers[id]); } } 各ワーカー((ワーカー) => { worker.send('すべてのワーカープロセスに通知'); }); 各作業者には ID 番号があり、それを使用して作業者の位置を特定します。 クラスター内のワーカーワーカー クラスには、ワーカー プロセスに関するすべての共通情報とメソッドが含まれています。 cluster.fork が生成するのはワーカー オブジェクトです。 ワーカー イベントはクラスター イベントと非常によく似ており、切断、エラー、終了、リスニング、メッセージ、オンラインの 6 つのイベントをサポートします。 ワーカーには、id、process、exitedAfterDisconnect の 3 つのプロパティが含まれます。 id はワーカーの一意の識別子です。 ワーカー内のプロセスは、実際には child_process.fork() を通じて作成される ChildProcess オブジェクトです。 プロセスはワーカー内のグローバル変数であるため、ワーカー内で直接プロセスを使用してメッセージを送信できます。 exitedAfterDisconnect は、ワーカー プロセスが .kill() または .disconnect() により終了した場合、値が true になることを意味します。他の手段で終了する場合、戻り値は false になります。ワーカー プロセスがまだ終了していない場合は未定義です。 アクティブな終了かパッシブな終了かを区別するには、worker.exitedAfterDisconnect を使用します。メイン プロセスは、この値に基づいてワーカー プロセスを再生成するかどうかを決定できます。 cluster.on('exit', (ワーカー、コード、シグナル) => { ワーカーが切断後に終了した場合 === true の場合 { console.log('これは自然終了なので、心配する必要はありません'); } }); // ワーカープロセスを終了します。 ワーカーを強制終了する ワーカーは、send、kill、destroy、disconnect、isConnected、isDead の 6 つのメソッドもサポートします。 ここでは主にメッセージを送信する send メソッドについて説明します。 ワーカー.send(メッセージ[, sendHandle[, オプション]][, コールバック]) send メソッドと child_process の send メソッド パラメータは実際には非常に似ていることがわかります。基本的に、worker.send はマスター プロセスにあり、特定のワーカー プロセスにメッセージを送信します。 ChildProcess.send() と同等です。ワーカー プロセスでは、これによりマスター プロセスにメッセージが送信されます。 process.send() と同等です。 クラスタがマスターの場合 ワーカーをクラスターにデプロイする ワーカー.send('hello'); } そうでない場合 (cluster.isWorker) { process.on('メッセージ', (msg) => { プロセス.send(メッセージ); }); } 上記の例では、メインプロセス内にいる場合は、worker.send を使用してメッセージを送信できます。子プロセスでは、ワーカー内のグローバル変数プロセスを使用してメッセージを送信できます。 要約するクラスターを使用すると、マルチコア CPU の利点を最大限に活用できます。実際のプロジェクトに適用していただければ幸いです。 上記は、Node.js でクラスターを作成する詳細についての簡単な説明です。Node.js でクラスターを作成する方法の詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。 以下もご興味があるかもしれません:
|
<<: MySQL でストアド プロシージャを作成し、データ テーブルに新しいフィールドを追加する方法の分析
>>: Windows 10 での Hyperledger Fabric 1.4 環境構築プロセスの図
CSS にカスケード メカニズムがあるのはなぜですか? CSS では、同じ要素の特定のプロパティに同...
この記事の内容: ページ中空マスクレイヤー、ページ中空マスクガイドレイヤー、画像中空マスク通常のマス...
成果を達成する実装コードhtml <div class="コンテナ">...
SQLはテーブル内の重複レコードをすべて見つけます1. テーブルには id と name の 2 つ...
新しく作成された Web サイトの場合は、ASP.NET MVC5 を例に挙げます。セッションを処理...
数日前、図書館はサーバー(Ubuntu 14.04)にセキュリティ上の脆弱性があり、時間通りに修復さ...
META タグは、一般的に タグと呼ばれ、HTML Web ページのソース コード内の重要な HTM...
今はモバイルインターネットが急速に発展している時代です。スマートフォンやタブレットはますます普及し、...
Optgroup は、ドロップダウン リストのコンテンツをより整理するために、select タグで使...
01. 概要絶対パスと相対パスはシェル環境でよく使用され、それぞれに独自の用途があります。相対パスの...
1. コマンドの紹介date コマンドは、現在の時刻または指定された時刻を指定された形式で表示するた...
背景SQL クエリを実行するときに、where 条件の vachar 型フィールドの単一引用符を削除...
1. どの 3 つの形式ですか?それぞれ、gif、jpg、png です。画像ファイルを最適化すること...
1. MySQLをダウンロードするMySQL 公式 Web サイトにログインし、MSI インストー...
私は長い間落ち込んでいます、なぜでしょうか?以前、お客様から、提供されたソフトウェアが正常に動作しな...