Node.js中如何處理耗時長的任務


  Node.js是單線程模型,運用在服務器模型中,如果一次用戶請求,后台做了耗時任務的處理,譬如復雜的數據運算等等,將會堵塞所有的用戶請求,無法利用起異步高並發的特征。不過可以通過child_process克隆進程的方式,防止線程阻塞,進程間可以進行通信。

     本文以斐波那契數列為例,如何優化此類問題。斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)。

 1 //--------------------parent.js-------------------
 2 const cp = require('child_process');
 3 const n = cp.fork(`${__dirname}/child.js`);
 4 
 5 n.on('message', (m) => {
 6   console.log(new Date().toLocaleString() + ' PARENT got message:', m);
 7 });
 8 
 9 console.log(new Date().toLocaleString() + ' PARENT send message');
10 n.send({ arg: 45 });

   

 1 //--------------------child.js-------------------
 2 'use strict';
 3 
 4 function fib(n) {
 5     if (n == 0) return 0;
 6     else if (n == 1) return 1;
 7     else return fib(n - 1) + fib(n - 2);
 8 }
 9 
10 process.on('message', (m) => {
11   console.log(new Date().toLocaleString() + ' CHILD got message:', m);
12   
13   let r = fib(m.arg);
14   
15   process.send({ result: r });
16   
17   console.log(new Date().toLocaleString() + ' CHILD send message:');
18 });

     執行結果

      

     任務管理器可以看到兩個進程

     

     不過,如果並發數很多,那個系統里面且不是有很多進程?會對資源造成很大的消耗,個人感覺Node對於這方面的處理還是弱些,適合IO密集的處理,不太適合CPU密集的處理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM