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

 

posted @ 2016-08-15 14:10  jeffrey.chu  阅读(2375)  评论(0编辑  收藏  举报

99code棋牌网