node基本理念(事件、多线程、进程)

本文详细解释了Node.js的单线程特性及其如何处理IO操作,并通过使用Cluster模块来创建多进程,从而充分利用多核CPU的能力。文章还介绍了如何在Express应用中集成Cluster模块以实现负载均衡。

关于node的几点理解:

1、所谓的node单线程,是指node的event loop,也就是我们的业务脚本是跑在一个单线程中的,可以理解为主线程;

2、若存在IO操作,例如文件、网络,是单独在线程里执行,将各种事件发送给上述的业务线程;例如业务线程里起的httpserver,会接受request、文件读取完成等事件;

3、IO工作线程存在多个,具体多个取决于libuv的配置,通常为4个,在windows下打开node,可以看到进程所包含线程为7;

4、如果将node配置为集群,则存在多个node进程;这些进程被分为主进程,和工作进程;通常利用如下:

cluster.on('exit', function(worker, code, signal) {
  console.log('worker ' + worker.process.pid + ' died');
});

if (cluster.isMaster) {
  cluster.fork();
  cluster.fork();
  console.log('master pid:' + process.pid);
} else {
  // Workers can share any TCP connection
  // In this case its a HTTP server
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world\n");
  }).listen(8000);
  console.log('child pid:' + process.pid);
}

主进程负责根据CPU的数量,fork子进程。子进程建立多个http服务器,由于cluster支持端口共享,因此不会出现端口冲突错误。

5、因此我理解,不管是工作进程还是主进程,都存在自己唯一的event loop;

6、express下扩展至cluster,修改如下(以enide建立的默认express工程为例):

var cluster = require( 'cluster' );

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

console.log("cCPUS:", cCPUs);

if( cluster.isMaster ) {
  // Create a worker for each CPU
  for( var i = 0; i < cCPUs; i++ ) {
    cluster.fork();
  }

  cluster.on( 'online', function( worker ) {
    console.log( 'Worker ' + worker.process.pid + ' is online.' );
  });
  cluster.on( 'exit', function( worker, code, signal ) {
    console.log( 'worker ' + worker.process.pid + ' died.' );
  });
}
else {
    http.createServer(app).listen(app.get('port'), function(){
          console.log('Express server listening on port ' + app.get('port'));
    });
}

 此时如果并发访问时,会将http请求分发到不同的进程。这个架构原理和nginx是一样的,本质都是父子进程共享端口。

后面是关于node 异步在segmentfault的一个问题,备注如下:

http://segmentfault.com/q/1010000004399488

转载于:https://www.cnblogs.com/Fredric-2013/p/5163581.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值