JavaScript は本質的にシングルスレッドの猛獣として設計されています。しかし、コンピューティングの荒野では、「マルチプロセッシング」や「マルチコア プロセッサ」として知られる捕食者が飼い慣らされ、コードの実行を前例のない速度まで高速化する準備を整えて待っています。 💪🚀
私は果敢にこのジャングルに足を踏み入れ、コードを究極の生存テストにさらし、驚くべき結果を得ました。 🏆 今度はあなたがこの魅力的なクエストに私と一緒に参加する番です。私たちは、魅力的なコード例を武器に、 Node.js のマルチプロセッシングの謎を深く掘り下げ、私の実験の素晴らしい成果に光を当てます 🔦 。 🍎🍏
マルチプロセッシングの魔法によってJavaScriptのパフォーマンスを大幅に向上させる、アドレナリンが出る冒険に出発する準備をしましょう。さあ、これからハイオクタン価のコーディングという魅惑的な領域に乗り出していきますので、しっかりと腰を据えて気を引き締めてください。
深く掘り下げる前に、信頼できるツールをいくつか用意しましょう。多くの場合困難な計算作業をシミュレートするために、いくつかの補助関数を作成します。新しいアーティファクト、 utils.js
という名前のファイルを作成し、そこにこれらの重要な呪文を刻みましょう。
// utils.js function generateRandomData(size) { const data = []; for (let i = 0; i < size; i++) { data.push(Math.random()); } return data; } function processData(data) { // performs some calculations on the array // to simulate high resource intensity let sum = 0; for (let num of data) { for (let j = 0; j < 1000000; j++) { sum += Math.sqrt(num); } } return sum; } module.exports = { generateRandomData, processData, };
単一スレッドでの実行は、問題解決に対する勤勉で信頼性の高いアプローチを表します。スクリプトのシングルスレッド バージョンは、そのように視覚的に説明できます。 シングルスレッド バージョンのコードは非常に簡単です。データを作成し、処理のために送信します。
// sync.js const { generateRandomData, processData } = require("./utils"); const data = generateRandomData(30000); console.time("single-thread. Time:"); processData(data); console.timeEnd("single-thread. Time:");
コマンド: node sync.js
を使用してスクリプトを起動します。
私たちは待って...待って...そして待って...
そして、すべての待機の後、スクリプトの実行時間を示すメッセージを受け取ります。
single-thread. Time:: 25.888s
このアプローチは、ほとんどの場合に当てはまります。しかし、問題が 1 つあります。正しく考えれば、待つという芸術を愛する人がいるだろうか?この悲惨な遅延を克服するには、コンピューターの火力を最大限に活用する必要があります。結局のところ、最新のコンピューターのほとんどには複数の CPU コアが搭載されています。
では、追加のコアが数値を処理し、 コードの実行を強化する可能性があるときに、なぜこれらの追加コアをアイドル状態にしておかなければならないのでしょうか?眠っている巨人に光を当てて、マルチプロセッシングの真の力を解き放つ時が来ました!飛び込んでみましょう!
マルチプロセス アプローチを採用することで、CPU の複数のコアを活用し、スクリプトのパフォーマンスを数倍向上させることができます。マルチプロセス コードの動作プロセスは、次の図で視覚化できます。
本質的には、大規模なデータセットをセグメントに分割し、処理する各セグメントを個別の CPU コアに割り当てているだけです。
multi-process.js
という名前のファイルを作成し、次の内容を入力します。
// multi-process.js const childProcess = require("child_process"); const utils = require("./utils"); const data = utils.generateRandomData(30000); const chunkSize = Math.ceil(data.length / 4); const chunks = []; for (let i = 0; i < 4; i++) { const start = i * chunkSize; const end = start + chunkSize; chunks.push(data.slice(start, end)); } console.time("multiProcessed"); const workers = []; let results = []; // result collection array for (let i = 0; i < chunks.length; i++) { const worker = childProcess.fork("./worker.js"); // pass its number and data to the workflow worker.send({ workerNumber: i, data: chunks[i] }); workers.push( new Promise((resolve, reject) => { worker.on("message", (result) => { results.push(result); // add the result to the result array resolve(); }); worker.on("error", reject); worker.on("exit", (code) => { if (code !== 0) { reject(new Error(`Worker stopped with exit code ${code}`)); } }); }) ); } Promise.all(workers) .then(() => { console.timeEnd("multiProcessed"); console.log("Processing results:", results); }) .catch((err) => console.error(err));
このコードは、Node.js での複数処理されたデータ処理の調和における、単独のワーカー プロセスのオーケストレーションを明らかにします。
簡単に説明すると、何が起こっているかは次のとおりです。
ワーカーはprocess.on('message')
を介してメイン プロセスからデータとその番号を受け取ります。
processData
関数は、このワーカーに割り当てられたデータの部分に対して計算を実行します。
結果は `process.send()` を介してメインプロセスに返されます。
ワーカーはprocess.exit()
を介してコード 0 で終了します。
コマンド: node multi-process.js
を使用してスクリプトを起動します。
ターボブーストをしっかりと握ってください...
そして、コードは 5 秒で機能したという結論が得られました。
Worker 0 started Worker 1 started Worker 2 started Worker 3 started ==================== Worker 1 finished ==================== Worker 2 finished ==================== Worker 3 finished ==================== Worker 0 finished multiProcessed: 5.266s Processing results: [ 4971422688.053512, 4989646323.157899, 4999088030.661542, 5008034869.924775 ]
私たちのスクリプトは 4 倍速く動作しました。それは素晴らしいことではありませんか?
強い好奇心を持って、4 コア プロセッサを搭載したコンピューターで両方のスクリプトを実行し、魔法が展開するのを待ちました。
ソロ アーティストであるシングル スレッド スクリプトは、 25.8 秒でデータを熱心に処理しました。
強力なチーム、私たちのマルチスレッド スクリプトは、わずか5.2 秒でそれをノックアウトしました。
マルチプロセッシングのパワーをご覧ください – 計算速度が 4 倍以上になります。
これらの明確な対比は、マルチプロセッシングがマシンの計算能力を大幅に強化し、実行時間を短縮できることを浮き彫りにしています。
私たちのスリリングな探求は、マルチプロセッシングがNode.js の計算タスクをどのように加速できるかを鮮やかに描きます。コードをすべての単一プロセッサ コアに解放すると、歩行からテレポートへの移行に似た、パフォーマンスの目に見える飛躍が得られます。
この矢印をコーディング quiver に追加し、プロジェクトでこのアプローチを試してみる価値は間違いなくあります。また、Node.js でのワーカー スレッドの出現により、マルチプロセッシングの実装が簡単になりました。
これを読んでアドレナリンが出てきましたか?以下のコメント欄で、Node.js でのマルチプロセッシングに関するあなた自身の冒険を自由に共有してください。これからも一緒に高速コーディングの謎を解き明かしていきましょう。