node js 进阶-node的多核实现

来源:互联网 发布:linux 源码 mysql 编辑:程序博客网 时间:2024/06/06 02:53

    从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;">10003738</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 程序的崩溃,所以在使用过程中一定要小心的处理大量的循环,字符串拼接和浮点运算。可以适当地将部分操作分给子线程或者子进程来完成,但是要切记子线程和子进程的使用也是有开销的,要恰恰当使用;

  

1 0
原创粉丝点击