ホームページ > ウェブフロントエンド > フロントエンドQ&A > NodejsでマルチコアCPUをオンラインで使用する方法

NodejsでマルチコアCPUをオンラインで使用する方法

PHPz
リリース: 2023-05-18 11:47:07
オリジナル
1506 人が閲覧しました

コンピュータ ハードウェア テクノロジの継続的な更新に伴い、プロセッサ コアの数も徐々に増加しています。現在、多くのコンピューターにはマルチコア CPU が搭載されており、コンピューター リソースをより効率的に使用してアプリケーションの処理を高速化できます。ただし、マルチコア CPU を最大限に活用するには、アプリケーションを最適化する必要があります。この記事では、Node.js アプリケーションでマルチコア CPU を最大限に活用する方法について説明します。

Node.js は、イベント駆動型のノンブロッキング I/O モデルに基づくサーバーサイド JavaScript 言語であり、効率的な I/O 機能、軽量なフットプリント、迅速な開発効率で高く評価されています。 。ただし、マルチコア CPU では、Node.js はデフォルトで 1 つの CPU コアしか使用できないため、Node.js アプリケーションのパフォーマンスが非常に低くなる可能性があります。マルチコアCPUを最大限に活用したい場合は、Node.jsのクラスターモジュールを使用する必要があります。

クラスター モジュールは Node.js のコア モジュールです。Node.js アプリケーションを複数のサブプロセスに分散できます。各サブプロセスは独立して実行され、マルチコア CPU を利用できます。クラスター モジュールを使用すると、Node.js アプリケーションをシンプルで簡単に拡張できる状態に保ちながら、そのパフォーマンスを効果的に向上させることができます。

クラスター モジュールを使用するいくつかの方法を次に示します。

  1. メインプロセスの作成

クラスターモジュールを使用する前に、最初にメインプロセスを作成する必要があります。メインプロセスは、実際のビジネスロジックを処理しないプロセスであり、主なタスクは子プロセスを管理することです。マスター プロセスは、クラスター モジュールのマスター属性を使用して作成できます。

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 正在运行`);
  
  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  
  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已经退出`);
  });
} else {
  console.log(`工作进程 ${process.pid} 已经启动`);
  
  // TODO: 实际的业务逻辑处理
}
ログイン後にコピー

このコード例では、cluster.isMaster 属性を使用して、現在のプロセスがマスター プロセスであるかどうかを確認します。それがメインプロセスの場合、複数の子プロセスを開始し、その終了イベントをリッスンします。ワーカー プロセスの場合は、実際のビジネス ロジックを処理します。

  1. ホットコードのリロード

実際の開発プロセスでは、コードの変更が頻繁に発生します。すべての子プロセスの再起動を避けるために、クラスター モジュールはワーカー プロセスを再起動するホット リロード方法を提供します。信号イベントをリッスンするには、cluster.on('SIGUSR2', ...) を使用できます。信号が受信されたら、すべての子プロセスを再起動します:

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

function startWorker() {
  const worker = cluster.fork();
  console.log(`工作进程 ${worker.id} 已经启动`);
}

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 正在运行`);
  
  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    startWorker();
  }
  
  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已经退出,重启中...`);
    startWorker();
  });
  
  cluster.on('SIGUSR2', () => {
    console.log('收到信号,重启所有工作进程...');
    const workers = Object.values(cluster.workers);
    
    const restartWorker = (workerIndex) => {
      const worker = workers[workerIndex];
      if (!worker) return;
      
      worker.on('exit', () => {
        if (!worker.exitedAfterDisconnect) return;
        console.log(`工作进程 ${worker.process.pid} 重新启动`);
        startWorker();
        restartWorker(workerIndex + 1);
      });
      
      worker.disconnect();
    }
    
    restartWorker(0);
  });
  
} else {
  console.log(`工作进程 ${process.pid} 已经启动`);
  
  // TODO: 实际的业务逻辑处理
}
ログイン後にコピー

このサンプル コードでは、SIGUSR2 信号を受信すると、 、SIGTERM シグナルがすべてのワーカー プロセスに送信され、正常にシャットダウンしてから再起動されます。

  1. 共有サーバー ポート

Node.js では、複数のプロセスが同じサーバー ポートを共有できます。このアプローチにより、各ワーカー プロセスが受信接続を処理できるようになり、アプリケーションのパフォーマンスが向上します。クラスター モジュールを使用する場合、次のコードを使用してサーバー ポートを共有できます:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 正在运行`);
  
  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  
  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已经退出`);
  });
} else {
  console.log(`工作进程 ${process.pid} 已经启动`);
  
  const server = http.createServer((req, res) => {
    res.writeHead(200);
    res.end('你好世界
');
  });
  
  server.listen(3000, (err) => {
    if (err) throw err;
    console.log(`工作进程 ${process.pid} 正在监听3000端口`);
  });
}
ログイン後にコピー

このコード例では、各ワーカー プロセスはポート 3000 でリッスンします。受信接続が受信されると、サーバーはそれを別のワーカー プロセスにルーティングし、アプリケーションのパフォーマンスを向上させます。

概要

クラスター モジュールを使用すると、Node.js アプリケーションがマルチコア CPU 上のコンピューター リソースを最大限に活用できるようになります。クラスター モジュールを使用する場合は、次の点に注意する必要があります。

  • メイン プロセスは子プロセスの管理のみを担当し、ビジネス ロジックは処理しません。
  • ワーカー プロセスは独立して実行され、実際のビジネス ロジックを処理する必要があります。
  • コードのホットリロードを使用すると、すべてのワーカー プロセスの再起動を回避できます。
  • 複数のプロセスが同じサーバー ポートを共有して、アプリケーションのパフォーマンスを向上させることができます。

マルチコア CPU をより効果的に使用するには、非同期 I/O 操作、メモリ管理、コードの最適化など、他の最適化が必要です。さまざまなテクノロジーを組み合わせてアプリケーションを最適化すると、マルチコア CPU でのパフォーマンスが向上し、ユーザーにより優れたエクスペリエンスを提供できます。

以上がNodejsでマルチコアCPUをオンラインで使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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