zoukankan      html  css  js  c++  java
  • node基本理念(事件、多线程、进程)

    关于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
    ");
      }).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

  • 相关阅读:
    OpenCV进阶之路:神经网络识别车牌字符
    System.ComponentModel.DataAnnotations.Schema.TableAttribute 同时存在于EntityFramework.dll和System.ComponentModel.DataAnnotations.dll中
    windows server 禁用智能卡服务的步骤
    yum 安装时错误 Errno 14 Couldn't resolve host 解决办法
    解决 CentOS7 安装完成后ifconfig命令不能用
    C#下RSA算法的实现(适用于支付宝和易宝支付)
    centos下问题:connect:network is unreachable
    maven 跳过单元测试
    Docker
    Jenkins和Docker
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/5163581.html
Copyright © 2011-2022 走看看