• 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

  • 相关阅读:
    GDataXML的配置和使用
    NSIndexPath初始化
    Xcode常用快捷键
    objective c的注释规范
    UIView不能使用UITableView的Static表格的解决方法
    在一个UIView中如何使用多个UIPickerView
    如何自定义UIPickerView中文本的大小和文本靠左或靠右显示?
    如何在SQL Server中的SELECT TOP 中使用变量
    Android学习之Android studio篇-Android Studio快捷键总结(mac)
    Delphi使程序的窗口出现在最前面并激活
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/5163581.html
Copyright © 2020-2023  润新知