ホームページ > ウェブフロントエンド > jsチュートリアル > ワーカースレッドと子プロセスについて

ワーカースレッドと子プロセスについて

Susan Sarandon
リリース: 2024-12-28 18:19:26
オリジナル
602 人が閲覧しました

ワーカー スレッドを使用すると、JavaScript コードを複数のスレッドで実行できます。これらは、SharedArrayBuffer を介してスレッド間でメモリを共有したり、データ処理や計算などの CPU に依存するタスクをオフロードしたりするのに最適です。

子プロセス

子プロセスを使用すると、別のプロセスを生成して、メインの Node.js プロセスから独立してタスクを実行できます。これらは、分離が必要なタスク、または JavaScript 以外のスクリプトやバイナリを操作する場合に適しています。

ワーカー スレッドの実際の使用例

1️⃣ 画像処理
サイズ変更、トリミング、フィルターの適用などの大規模な画像変換を処理する場合、ワーカー スレッドはこれらのタスクを別のスレッドにオフロードして、メイン イベント ループのブロックを防ぐことができます。

例:

const { Worker } = require('worker_threads');

function resizeImage(imagePath) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./resizeWorker.js', { workerData: imagePath });
    worker.on('message', resolve);
    worker.on('error', reject);
  });
}

// Usage
resizeImage('image.jpg').then(() => console.log('Image resized!'));
ログイン後にコピー

2️⃣ データの解析と変換

大きな JSON ファイルの解析や CSV データの変換は、リソースを大量に消費する可能性があります。ワーカー スレッドはデータをチャンク単位で処理できるため、アプリケーションの応答性が確保されます。

例:

const { Worker } = require('worker_threads');

const worker = new Worker('./dataParser.js');
worker.postMessage({ filePath: 'largeData.json' });
worker.on('message', (data) => {
  console.log('Parsed Data:', data);
});
ログイン後にコピー

3️⃣ 数学的計算

ワーカー スレッドは、素数の生成、行列の乗算、シミュレーションなどの負荷の高い計算に最適です。

例:

const { Worker } = require('worker_threads');

function calculatePrimes(limit) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./primeWorker.js', { workerData: limit });
    worker.on('message', resolve);
    worker.on('error', reject);
  });
}

// Usage
calculatePrimes(100000).then(primes => console.log(primes));
ログイン後にコピー

子プロセスの実際の使用例

1️⃣ シェルコマンドの実行

アプリケーションがシェル コマンドを実行してシステムと対話する必要がある場合、子プロセスが最適な選択肢です。

例:

const { exec } = require('child_process');

exec('ls -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`Error: ${error.message}`);
    return;
  }
  console.log(`Output:\n${stdout}`);
});
ログイン後にコピー

2️⃣ 非 JavaScript スクリプトの実行

ワークフローに Python、Ruby、またはその他のスクリプト言語が含まれる場合、子プロセスを使用してこれらのスクリプトを実行し、その出力を処理できます。

例:

const { spawn } = require('child_process');

const pythonProcess = spawn('python', ['script.py']);

pythonProcess.stdout.on('data', (data) => {
  console.log(`Output: ${data}`);
});
ログイン後にコピー

3️⃣ マイクロサービス アーキテクチャ

マイクロサービスのようなアプローチでは、子プロセスを使用して、IPC (プロセス間通信) 経由でメイン プロセスと通信する分離された独立したタスクを処理できます。

例:

const { fork } = require('child_process');

const child = fork('./childService.js');

child.on('message', (message) => {
  console.log('Message from child:', message);
});

// Send a task to the child process
child.send({ task: 'processData', payload: [1, 2, 3] });
ログイン後にコピー

ワーカー スレッドと子プロセスの選択

Feature Worker Threads Child Processes
Memory Sharing Supported via SharedArrayBuffer Not supported
Task Isolation Shared environment, less isolated Fully isolated
Use Case CPU-intensive tasks in JavaScript System-level tasks or external code
Overhead Lower (same process) Higher (separate processes)
Communication Via message passing, faster Via IPC, slower
Supported Languages JavaScript/Node.js only Any scripting or system-level language
Startup Time Faster Slower
Error Containment Less contained, can crash the process Fully contained, isolated failures

ワーカー スレッドと子プロセスを使用するためのベスト プラクティス

集中的なタスクのオフロード: CPU に依存するタスクにはワーカー スレッドを使用し、I/O 負荷の高い操作や外部スクリプトの実行には子プロセスを使用します。

パフォーマンスの監視: Node.js の組み込みプロファイラーなどのツールを使用してボトルネックを特定します。

エラーを適切に処理します: エラーを処理するために常にエラーと終了イベントをリッスンします。

効果的なスケーリング: ワーカー プールまたはプロセス クラスターを使用して、タスクを複数のスレッドまたはプロセスに分散します。

結論

ワーカー スレッドと子プロセスにより、Node.js 開発者はシングル スレッドのイベント ループの制限から解放されます。これらのツールを活用すると、CPU と I/O を集中的に使用するタスクの両方を簡単に処理する、拡張性と応答性の高いアプリケーションを構築できます。画像の処理、シェル コマンドの実行、マイクロサービスの管理のいずれの場合でも、ワーカー スレッドと子プロセスをいつ使用するかを理解することが、Node.js アプリケーションのパフォーマンスを最適化する鍵となります。

Understanding Worker Threads and Child Processes

以上がワーカースレッドと子プロセスについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート