美文网首页
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

    使用cluster将自己的Node服务器扩展为多线程服务器 node从他推出至今,充满赞美和饱受诟病的都是其单线程...

  • ElasticSearch配置

    ElasticSearch配置 概念 节点 (node), 集群 (cluster)单台服务器,存储数据并参与集群...

  • node集群(cluster)

    使用例子 为了让node应用能够在多核服务器中提高性能,node提供cluster API,用于创建多个工作进程,...

  • 1.Elasticsearch基本概念

    相关概念讲解 1.Cluster和node: Cluster是对外提供搜索服务的集群, 组成这个Cluster的各...

  • elasticsearch 参数

    cluster.name: 指定node所属的cluster。 node.name: 本机的hostname。 n...

  • cluster 和 child_process

    cluster的底层实现还是child_process ,cluster 模块允许简单容易的创建共享服务器端口的子...

  • Rabbitmq Cluster 搭建

    rabbitmq cluster 搭建 vim /etc/hosts 192.168.1.1 node1 192....

  • 使用cluster实现多线程

    1: 新创建一个master.js,代码如下: 通过上面的代码 可以有多个线程同时开启 访问app.js,结果如图...

  • 17、集群

    一、节点 1、启动节点 1)CLUSTER MEET 命令把指定服务器,添加当前集群 2)CLUSTER ...

  • 基本概念

    基本概念 1、Node与Cluster 2、Index 3、Document 4、Type

网友评论

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

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