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