検索
ホームページウェブフロントエンドjsチュートリアルクラスタリングとワーカー スレッド - Node JS

Clustering and Worker Threads - Node JS

前の記事「ノード JS の内部」では、ノード JS の内部アーキテクチャについて説明し、複数のリクエストを同時に処理するためにノードのスレッド プール サイズを増やす必要がある理由についても説明しました。スケーラビリティとパフォーマンスはスレッド プールのサイズに関係がないことをお伝えしました。

スケーラビリティと高いパフォーマンスを実現するために、クラスタリングとワーカー スレッドを使用できます。

クラスタリング

あなたが盛大な結婚式に出席していて、何千人ものゲストが出席しているとします。キッチンが 1 つあり、1 人のコックがゲスト全員の食事を準備しています。予測不可能だと思いますよね?料理人が 1 人しかいない場合、キッチンのリソースを最大限に活用することはできません。

これは、すべてのリクエストを処理するために 1 つのコアだけが使用されている場合に、マルチコア CPU 上で実行されている Node JS アプリケーションでまさに起こることです。したがって、私たちのマシンはマルチコアの能力を備えていますが、クラスタリングがなければ、アプリケーションは 1 コアだけで実行されます。 1 つのコアがすべての作業を処理します。

キッチンで複数の調理人が働いているとき、それがクラスタリングです。

クラスタリングは、単一ノードの JS アプリケーションが複数の CPU コアを効果的に利用できるようにするために使用される手法です。

クラスタリングを実装するには、Node JS のクラスター モジュールを使用する必要があります。

const cluster = require('cluster');

このクラスター モジュールを使用すると、Node JS アプリケーションの複数のインスタンスを作成できます。これらのインスタンスはワーカーと呼ばれます。すべてのワーカーは同じサーバー ポートを共有し、受信リクエストを同時に処理します。

クラスター アーキテクチャには 2 種類のプロセスがあります。

1.マスタープロセス:

マスタープロセスは、従業員を管理するキッチンのメインコックのようなものです。アプリケーションを初期化し、クラスタリング環境をセットアップし、タスクをワーカー プロセスに委任します。アプリケーションリクエストを直接処理しません。

マスタープロセスは何をしますか?

  • cluster.fork() メソッドを使用して複数のワーカー プロセスを作成します。また、ワーカーがクラッシュしたり予期せず終了した場合にも、ワーカーが再起動されます。

  • 受信リクエストがすべてのワーカー プロセスに確実に分散されるようにします。 Linux では、これはオペレーティング システムによって処理され、Windows では、Node JS 自体がロード バランサーとして機能します。

  • IPC(プロセス間通信)を介したワーカー間の通信を可能にします。

2.ワーカープロセス:

ワーカー プロセスは、マスター プロセスによって作成された Node JS アプリケーションのインスタンスです。各プロセスは個別の CPU コアで独立して実行され、受信リクエストを処理します。

ワーカー プロセスは相互に直接通信できず、マスター経由で通信します。

ワーカー プロセスは受信リクエストを処理し、データベース クエリ、計算、アプリケーション ロジックなどのいくつかのタスクを実行します。

const cluster = require('cluster');

ここでは、最初にこれがマスタープロセスであることを確認しています。 「はい」の場合、ワーカー プロセスが作成されます。

コードでは、cluster.fork() を使用してワーカー プロセスを作成しています。

しかし、これはワーカー プロセスを作成する理想的な方法ではありません。

4 つのワーカー プロセスを作成しており、システムに 2 つのコアがあるとします。

ハードコーディングされたワーカー プロセスを作成するのではなく、この問題を解決するには、まず CPU コアを見つけてから、データがワーカー プロセスを作成すると考えます。

const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers
    cluster.fork();
    cluster.fork();
    cluster.fork();
    cluster.fork();

} else {
  console.log(`Worker ${process.pid} is running`);
  // Worker logic (e.g., server setup) goes here
}

デュアルコアシステムを使用しているため、出力は次のようになります。

const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);
  const numCPUs = os.cpus().length;

  // Fork workers
  for (let i = 0; i 



<p><strong>ここで、デュアルコア CPU を使用している場合、なぜ 4 つのワーカー プロセスが作成されるのかという質問があります。</strong></p>

<p>これは、論理コアの数が 4 であるためです。私の CPU はハイパースレッディングまたは同時マルチスレッド (SMT) をサポートしています。</p>

<h2>
  
  
  ワーカースレッド
</h2>

<p>レストランでは、調理には時間がかかるため、ウェイターが注文を受け取り、その注文を調理チームに伝えます。テーブルの清掃やその他のウェイター関連の仕事が来たら、ウェイターがこれを行います。注文の準備ができたら、調理人はウェイターに料理を返し、ウェイターはその料理を顧客に提供します。</p>

<p>これは、ワーカー スレッドに関連する同じシナリオです。大規模なデータ処理、複雑な計算、重いアルゴリズムなどの計算量の多いタスクが発生した場合、メインスレッドはこのタスクをワーカー スレッドに委任します。メインスレッドではなく、ワーカーがこのタスクを実行します。</p>

<p>*<em>これは役に立ちますか?  *</em></p>

<p>Node JS イベント ループはシングルスレッドであることがわかっており、この重い計算作業がメイン スレッドによって行われる場合、イベント ループはブロックされます。これらのワーカー スレッドを使用する場合、これらの重いタスクはワーカー スレッドに与えられ、メイン スレッドではなくワーカー スレッドがこれらのタスクを実行するため、イベント ループがブロックされません。</p>

<p>ワーカー スレッドはメッセージ パッシング システムを介してメイン スレッドと通信でき、構造化クローン (ディープ コピー) を使用してスレッド間でデータを送信できます。</p>

<p>ここで、ワーカー スレッドの動作を模倣しようとしています。</p>

<p><strong>main.js (メインスレッド)</strong><br>
</p>

<pre class="brush:php;toolbar:false">Master 12345 is running
Worker 12346 is running
Worker 12347 is running
Worker 12348 is running
Worker 12349 is running

worker.js (ワーカー スレッド)

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

function startWorker() {
  const worker = new Worker('./worker.js'); // Create a worker using worker.js

  // Listen for messages from the worker
  worker.on('message', (message) => {
    console.log('Message from worker:', message);
  });

  // Handle errors in the worker
  worker.on('error', (error) => {
    console.error('Worker error:', error);
  });

  // Handle worker exit
  worker.on('exit', (code) => {
    console.log(`Worker exited with code ${code}`);
  });

  // Send a message to the worker
  worker.postMessage({ num: 100 });
}

startWorker();

データに大きな構造が含まれている場合、データは深く複製されて渡されるため、パフォーマンスのオーバーヘッドが発生する可能性があります。

コードの動作

  • Worker クラスは、新しいスレッドを生成するために使用されます。

  • worker.postMessage を使用してワーカーにデータを送信し、worker.on('message', callback) でメッセージをリッスンできます。

  • ワーカー スレッドでは、parentPort がメイン スレッドと通信するためのプライマリ インターフェイスです。

  • メイン スレッド (parentPort.on('message')) からのメッセージをリッスンし、parentPort.postMessage を使用してメッセージを送り返すことができます。

出力は次のようになります:

const cluster = require('cluster');

さて、あなたにも質問が 1 つあります。何百ものワーカー スレッドを作成したらどうでしょうか?

しかし、その理由は、コアの数より多くのスレッドを作成すると、スレッドが CPU 時間をめぐって競合し、コンテキストの切り替えにつながり、コストが高くなり、全体的なパフォーマンスが低下するためです。

Node.js でクラスタリング、ワーカー スレッド、またはその両方を使用する必要があるのはどのような場合ですか?

1.ワーカー スレッドをいつ使用するか?

  • CPU に依存するタスク:

タスクには、画像/ビデオ処理、データ圧縮または暗号化、機械学習推論、科学計算などの大量の計算が含まれます

  • 共有メモリが必要です:

スレッド間でデータを重複せずに効率的に共有する必要があります。

  • シングルコアの使用:

アプリケーションが 1 つのプロセス内でのみ拡張する必要があるが、それでも CPU を集中的に使用するタスクの並列処理が必要な場合。

2.クラスタリングをいつ使用するか?

  • I/O バウンド:

タスクには、Web、サーバー、チャット アプリケーション、API などの多数のクライアント リクエストの処理が含まれます。クラスタリングは、リクエストをすべての CPU コアに分散することで水平方向に拡張するのに役立ちます。

  • 分離されたメモリ:

アプリケーションはプロセス間で大量のデータを共有する必要はありません。

  • マルチコアの使用率:

複数の Node.js プロセスを生成して、利用可能なすべてのコアを利用したいと考えています。

3.クラスタリング スレッドとワーカー スレッドの両方を使用する場合は?

  • I/O バウンド CPU バウンドのタスク:

アプリケーションは HTTP リクエストを処理しますが、計算負荷の高いタスクをオフロードします。例: Web サーバーはファイルのアップロードを処理し、画像のサイズ変更やビデオのトランスコーディングを実行します。

  • 高いスケーラビリティ:

高スループットを実現するには、プロセスレベルとスレッドレベルの両方の並列処理が必要です。 E コマース サイトでは、クラスタリングにより、複数のプロセスが受信リクエストを処理できるようになります。ワーカー スレッドは、パーソナライズされた推奨事項の生成などのバックグラウンド タスクを処理します。

ありがとうございます。

お気軽にご質問やご提案をお寄せください。

これが有益であると感じた場合は、気に入ってください。

以上がクラスタリングとワーカー スレッド - Node JSの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)