美文网首页
Node实现多线程服务器(1)Cluster

Node实现多线程服务器(1)Cluster

作者: Yossef | 来源:发表于2017-12-24 21:35 被阅读0次

    使用cluster将自己的Node服务器扩展为多线程服务器

        node从他推出至今,充满赞美和饱受诟病的都是其单线程模型,所有的任务都在一个线程中完成(I/O等例外),优势的地方自然是免去了频繁切换线程的开销,以及减少资源互抢的问题等等,但是当nodejs面对cpu密集型模型的时候就力不从心了。尽管node拥有异步机制,可以把一些耗时算法丢入eventloop等待下个事件循环再做,但是因为其任然是单线程模型,所以终究会造成阻塞。

        node是单线程的,也就是说跑在8核CPU上,只能使用一个核的算力。单线程一直是node的一个诟病,但随着0.6版本中引入cluster之后,这个情况则得到了改变,开发人员可以依靠cluster很轻松的将自己的Node服务器扩展为多线程服务器了。

    什么是Cluster

    cluster是node提供的一个多线程库,用户可以使用它来创建多个线程,线程之间共享一个监听端口,当有外部请求这个端口时,cluster会将请求转发到随机线程里。因为每个node线程都会占用几十兆的内存,所以不能像php那样对每个请求创建一个线程,一般来说创建的线程数最多都不会超过cpu的核心数量。

    var cluster = require('cluster');

    var http = require('http');

    var numCPUs = require('os').cpus().length;

    if (cluster.isMaster) {

      // Fork workers.-fam51

          for (var i = 0; i < numCPUs; i++) {   

                cluster.fork();

          }

          cluster.on('exit', function(worker, code, signal) {

                console.log('worker ' + worker.process.pid + ' died');

          });

    } else {

          // Workers can share any TCP connection 

          // In this case its a HTTP serverq

          http.createServer(function(req, res) {

                res.writeHead(200);    res.end("hello world\n"); 

           }).listen(8000);

    }

    如以上代码所示,程序运行时cluster.isMaster会被设置为true,当调用cluster.fork()之后,程序会创建一个线程,并重新运行,这时cluster.isMaster就被设置为false了。我们就主要通过这个变量来判断当前线程是不是子线程的。还可以注意到,每个子线程被创建之后,都会监听8000端口而不会引起冲突,这就是cluster共享端口的功能了。

    相关文章

      网友评论

          本文标题:Node实现多线程服务器(1)Cluster

          本文链接:https://www.haomeiwen.com/subject/fetkgxtx.html