node js 进阶-node的多核实现

    从node 出现到现在,一直被我们熟知的是它的单线程模型,所有的任务都在一个线程中完成,从而免去了频繁切换线程的开销,以及减少资源互抢的问题。但是当我们的程序是CPU 密集型模型的时候node js 就显得不再有那么多优势,尽管node js 拥有异步机制,可以把一些耗时算法等待下个事件再实现,但是node js毕竟使用的是单线程模型,所以终究会出现阻塞,那node js 是如何处理高并发的呢?不会是不支持多线程吧?

    而且虽然node  js 是单线程异步非阻塞的,那是不是我们就可以高枕无忧了?举个栗子,当我们买完套餐(未领取)接着去买饮料的时候,已经叫我的号让我去取餐,但是我等了好久才拿到饮料,所以最终我会在套餐号被叫了很久之后我才去拿套餐,这就是我们特别担心的单线程的阻塞情况。

   先来看一个示例代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;">var start = Date.now();//获取当前时间戳
setTimeout(function () {
    console.log(Date.now() - start);
    for (var i = 0; i < 1000000000; i++){//执行长循环
    }
}, 1000);
setTimeout(function () {
    console.log(Date.now() - start);
}, 2000);</span>
    上述程序执行出的结果:

<span style="font-family:KaiTi_GB2312;font-size:18px;">1000
3738</span>
    对于我们期望2秒之后执行的setTimeOut函数其实是经过了3738 毫秒之后才执行,因为执行了一个时间很长的for循环,所以我们整个node js 主线程被阻塞了,如果我们处理1000个用户请求,那么,因为其中第一个被阻塞,其余的999个请求都会被延迟执行,这样用户的体验度相当值得深思啊;虽然node 可以处理并发,但是我们依旧无法确保某一时刻不阻塞请求;

    在Java,C#中都有对应的多线程编程,虽然有时候用起来会麻烦一些,但是在处理高并发的能力不得不感叹。所以如果node js 有创建子线程的能力,我们使用node 处理高并发请求的问题不就迎刃而解了?

   cluster可以用来让node js 充分发挥多核CPU的性能:

<span style="font-family:KaiTi_GB2312;font-size:18px;">varcluster=require('cluster');
varnumCPUs=8;
functionfibo(n){
   returnn>1?fibo(n-1)+fibo(n-2):1;
}
 console.time('8cluster');
 if(cluster.isMaster){
//Forkworkers.
for(vari=0;i<numCPUs;i++){
    cluster.fork();
}
vari=8;
cluster.on('exit',function(worker,code,signal){
if(!--i){
  console.timeEnd('8cluster');
   process.exit(0);
  }
  });
}else{
   console.log(fibo(40));
    process.exit(0);

}</span>
    node js 的单线程给我们带来了莫大的遍历和乐趣,但使用单线程的过程中要警惕node 中异常捕获的疏忽导致整个node js 程序的崩溃,所以在使用过程中一定要小心的处理大量的循环,字符串拼接和浮点运算。可以适当地将部分操作分给子线程或者子进程来完成,但是要切记子线程和子进程的使用也是有开销的,要恰恰当使用;

  

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值