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密集的處理。