コンピュータ ハードウェア テクノロジの継続的な更新に伴い、プロセッサ コアの数も徐々に増加しています。現在、多くのコンピューターにはマルチコア 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 アプリケーションをシンプルで簡単に拡張できる状態に保ちながら、そのパフォーマンスを効果的に向上させることができます。
クラスター モジュールを使用するいくつかの方法を次に示します。
クラスターモジュールを使用する前に、最初にメインプロセスを作成する必要があります。メインプロセスは、実際のビジネスロジックを処理しないプロセスであり、主なタスクは子プロセスを管理することです。マスター プロセスは、クラスター モジュールのマスター属性を使用して作成できます。
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 属性を使用して、現在のプロセスがマスター プロセスであるかどうかを確認します。それがメインプロセスの場合、複数の子プロセスを開始し、その終了イベントをリッスンします。ワーカー プロセスの場合は、実際のビジネス ロジックを処理します。
実際の開発プロセスでは、コードの変更が頻繁に発生します。すべての子プロセスの再起動を避けるために、クラスター モジュールはワーカー プロセスを再起動するホット リロード方法を提供します。信号イベントをリッスンするには、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 シグナルがすべてのワーカー プロセスに送信され、正常にシャットダウンしてから再起動されます。
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 サイトの他の関連記事を参照してください。