国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Node.js 多進程處理CPU密集任務的實現

2024-05-06 15:38:56
字體:
來源:轉載
供稿:網友

Node.js 單線程與多進程

大家都知道 Node.js 性能很高,是以異步事件驅動、非阻塞 I/O 而被廣泛使用。但缺點也很明顯,由于 Node.js 是單線程程序,如果長時間運算,會導致 CPU 不能及時釋放,所以并不適合 CPU 密集型應用。

當然,也不是沒有辦法解決這個問題。雖然 Node.js 不支持多線程,但是可創建多子進程來執行任務。
Node.js 提供了 child_process 和 cluster 兩個模塊可用于創建多子進程

下面我們就分別使用單線程和多進程來模擬查找大量斐波那契數進行 CPU 密集測試

以下代碼是查找 500 次位置為 35 的斐波那契數(方便測試,定了一個時間不需要太長也不會太短的位置)

單線程處理

代碼:single.js

function fibonacci(n) { if (n == 0 || n == 1) {  return n; } else {  return fibonacci(n - 1) + fibonacci(n - 2); }}let startTime = Date.now();let totalCount = 500;let completedCount = 0;let n = 35;for (let i = 0; i < totalCount; i++) { fibonacci(n); completedCount++; console.log(`process: ${completedCount}/${totalCount}`);}console.log("👏 👏 👏 👏 👏 👏 👏 👏 👏 👏");console.info(`任務完成,用時: ${Date.now() - startTime}ms`);console.log("👏 👏 👏 👏 👏 👏 👏 👏 👏 👏");

執行node single.js 查看結果

在我的電腦上顯示結果為44611ms(電腦配置不同也會有差異)。

...
process: 500/500
👏 👏 👏 👏 👏 👏 👏 👏 👏 👏
任務完成,用時: 44611ms
👏 👏 👏 👏 👏 👏 👏 👏 👏 👏

查找 500 次需要 44 秒,太慢了。可想而知如果位置更大,數量更多...

那我們來嘗試用多進程試試 ⬇️

多進程

采用 cluster 模塊,Master-Worker 模式來測試

共 3 個 js,分別為主線程代碼:master.js、子進程代碼:worker.js、入口代碼:cluster.js(入口可無需單獨寫一個 js、這里是為了看起來更清楚一些)

主線程代碼:master.js

const cluster = require("cluster");const numCPUs = require("os").cpus().length;// 設置子進程執行程序cluster.setupMaster({ exec: "./worker.js", slient: true});function run() { // 記錄開始時間 const startTime = Date.now(); // 總數 const totalCount = 500; // 當前已處理任務數 let completedCount = 0; // 任務生成器 const fbGenerator = FbGenerator(totalCount); if (cluster.isMaster) {  cluster.on("fork", function(worker) {   console.log(`[master] : fork worker ${worker.id}`);  });  cluster.on("exit", function(worker, code, signal) {   console.log(`[master] : worker ${worker.id} died`);  });  for (let i = 0; i < numCPUs; i++) {   const worker = cluster.fork();   // 接收子進程數據   worker.on("message", function(msg) {    // 完成一個,記錄并打印進度    completedCount++;    console.log(`process: ${completedCount}/${totalCount}`);    nextTask(this);   });   nextTask(worker);  } } else {  process.on("message", function(msg) {   console.log(msg);  }); } /**  * 繼續下一個任務  *  * @param {ChildProcess} worker 子進程對象,將在此進程上執行本次任務  */ function nextTask(worker) {  // 獲取下一個參數  const data = fbGenerator.next();  // 判斷是否已經完成,如果完成則調用完成函數,結束程序  if (data.done) {   done();   return;  }  // 否則繼續任務  // 向子進程發送數據  worker.send(data.value); } /**  * 完成,當所有任務完成時調用該函數以結束程序  */ function done() {  if (completedCount >= totalCount) {   cluster.disconnect();   console.log("👏 👏 👏 👏 👏 👏 👏 👏 👏 👏");   console.info(`任務完成,用時: ${Date.now() - startTime}ms`);   console.log("👏 👏 👏 👏 👏 👏 👏 👏 👏 👏");  } }}/** * 生成器 */function* FbGenerator(count) { var n = 35; for (var i = 0; i < count; i++) {  yield n; } return;}module.exports = { run};            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 柳河县| 鄱阳县| 常山县| 集安市| 漳州市| 五河县| 宁强县| 潼南县| 宣威市| 南皮县| 南川市| 安多县| 侯马市| 凌源市| 洛川县| 仙居县| 镇安县| 密云县| 平潭县| 安仁县| 稻城县| 淳化县| 吉隆县| 内江市| 阳信县| 自治县| 黎川县| 朔州市| 德令哈市| 泾川县| 潢川县| 浦城县| 湾仔区| 忻城县| 柳江县| 伊宁市| 天水市| 德惠市| 青冈县| 封丘县| 钟祥市|