ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js のパフォーマンスをマスターする: ワーカー スレッドとクラスタリングの力を解き放つ — Hoai Nho
Node.js は シングルスレッドであることで知られており、イベント ループを活用して非同期操作を効率的に処理します。ただし、CPU 集中型のタスクを処理したり、複数の CPU コアを利用したりするには、ワーカー スレッド と クラスタリング というより高度なアプローチが必要です。この記事では、これらのテクニックについて詳しく説明し、直接使用できる明確な説明と実践的なコード例を提供します。
1.概要: ワーカー スレッドとクラスタリングを使用する理由
どちらの手法もスケーラビリティとパフォーマンスに対応しますが、次の点が異なります。
2.イベントループとマルチスレッドの必要性
Node.js の イベント ループ はシングルスレッドです。 I/O バウンドのタスクにはうまく機能しますが、画像処理、暗号化、複雑な計算などのCPU 負荷の高い操作には苦労します。マルチスレッドを使用しない場合、これらの操作はイベント ループをブロックし、パフォーマンスに影響を与えます。
3. Node.js のワーカー スレッド
ワーカー スレッドを使用すると、複数のスレッドで JavaScript コードを実行でき、メイン スレッドがブロックされるのを防ぎます。
例: ワーカー スレッドを使用した画像圧縮
この例では、ワーカー スレッドを使用して、メイン イベント ループをブロックせずに画像を圧縮する方法を示します。
ステップ 1: 画像処理のために Sharp をインストールします。
npm install sharp
ステップ 2: image-worker.js (ワーカー コード) を作成します。
npm install sharp
ステップ 3:worker_threads のワーカーを使用するメインスレッド。
const { parentPort, workerData } = require('worker_threads'); const sharp = require('sharp'); // Compress the image sharp(workerData.inputPath) .resize(800, 600) .toFile(workerData.outputPath) .then(() => parentPort.postMessage('Compression complete')) .catch(err => parentPort.postMessage(`Error: ${err.message}`));
仕組み
4. Node.js でのクラスタリング
クラスタリングには、使用可能なすべての CPU コアを利用して、Node.js プロセスの複数のインスタンスを生成することが含まれます。これは、トラフィックの多い Web サーバーで特に役立ちます。
例: クラスターを使用した単純な HTTP サーバー
この例では、クラスター モジュールを使用してスケーラブルな HTTP サーバーを作成する方法を示します。
const { Worker } = require('worker_threads'); const path = require('path'); function compressImage(inputPath, outputPath) { return new Promise((resolve, reject) => { const worker = new Worker(path.resolve(__dirname, 'image-worker.js'), { workerData: { inputPath, outputPath } }); worker.on('message', message => resolve(message)); worker.on('error', reject); worker.on('exit', code => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); } // Example usage compressImage('input.jpg', 'output.jpg') .then(console.log) .catch(console.error);
仕組み
5.ワーカースレッドまたはクラスター間の通信
ワーカーコミュニケーション (Pub/Sub パターン)
ワーカーとメインスレッドは、Pub/Sub モデル と同様の、メッセージ パッシング を介して通信します。上記の画像圧縮の例では、ワーカー スレッドは、parentPort.postMessage() を使用してメイン スレッドにステータス更新を送信します。
クラスターまたはスレッド間のより高度な通信には、Redis Pub/Sub または メッセージ キュー (RabbitMQ など) を使用できます。
6.ワーカー スレッドとクラスタリングをどちらに使用するか?
Aspect | Worker Threads | Clustering |
---|---|---|
Use case | CPU-intensive tasks | High-traffic applications |
Execution | Runs within a single process | Spawns multiple processes |
Performance | Avoids blocking the event loop | Utilizes multiple CPU cores |
Communication | Message passing between threads | Message passing between processes |
Fault Tolerance | Limited to process-level recovery | Can restart individual processes |
使用例
7.ワーカーとクラスターを使用するためのベスト プラクティス
8.結論
ワーカー スレッド と クラスタリング は両方とも、Node.js アプリケーションのパフォーマンスとスケーラビリティを向上させる強力なツールです。ワーカー スレッドは、イベント ループをブロックすることなくCPU に依存するタスクに最適ですが、クラスタリングを使用すると、複数の CPU コアにわたって Web サーバーを水平方向に拡張できます。
違いを理解し、ユースケースに適したアプローチを選択することで、アプリケーションのスループットと復元力を大幅に強化できます。
以上がNode.js のパフォーマンスをマスターする: ワーカー スレッドとクラスタリングの力を解き放つ — Hoai Nhoの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。