nodejs是单线程,这意味着Node只能利用一个处理器来工作。但多数服务器都有多个核。好在nodejs提供了cluster模块,可以把任务分配给子进程。每个子进程有些特殊能力,比如能与其他子进程共享socket连接。当用cluster时,主进程不会参与每个具体的事务中,主进程管理所有的子进程,但当子进程与I/O操作交互时,它们是直接进程操作的,不需要通过主进程。

一个简单的例子:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length; if(cluster.isMaster)
{
//创建工作进程
for(var i=0; i<numCPUs; i++)
{
cluster.fork();
} cluster.on('death', function(worker)
{
console.log('worker' + worker.pid + 'died');
});
}
else
{
//工作进程创建http服务
http.Server(function(req, res)
{
res.writeHead(200);
res.end("Hello world\n");
}).listen(8000);
}

  cluster工作的原理是每一个Node进程要么是主进程,要么成为工作进程。当一个主进程调用cluster.fork()方法时,它会创建于主进程一模一样的子进程,除了两个让每个进程可以检查自己是父/子进程的属性以外。在主进程cluster.isMaster会返回true,而cluster.isWorker()会返回false,在主进程中则相反。

  除了共享socket外,还能利用cluster做更多事情,因为它是基于child_process模块的,这个模块会提供一系列属性,其中最有用一些可以检查子进程健康状态,在上面例子中,当子进程死亡时,主进程会用console.log()输出死亡进程,既然监测到了死亡进程,那么我们可以在这个子进程死亡时,再重新创建一个新的子进程。

cluster.on('death', function(worker)
{
console.log('worker' + worker.pid + 'died');
cluster.fork();
});

  这个简单的改进让主进程不停地把死掉的进程重启,从而保证所有的CPU都有我们的服务器在运行。其实还可以做更多的事情,因为工作进程可以传消息给主进程,所以可以让每个工作进程报告自己的状态,如内存使用量。这让主进程可以察觉哪些工作进程变得不稳定,确认哪些工作进程没有冻结,或者被堵塞。

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length; var rssWarn = (12*1024*1024),
heapWarn = (12*1024*1024); if(cluster.isMaster)
{
//创建工作进程
for(var i=0; i<numCPUs; i++)
{
var worker = cluster.fork();
worker.on('message', function(m)
{
if(m.memory)
{
if(m.memory.rss > rssWarn)
{
console.log('Worker' + m.process + 'using too much momory.');
}
}
})
} cluster.on('death', function(worker)
{
console.log('worker' + worker.pid + 'died');
cluster.fork();
});
}
else
{
//工作进程创建http服务
http.Server(function(req, res)
{
res.writeHead(200);
res.end("Hello world\n");
}).listen(8000); //每秒报告一次状态
setInterval(function report()
{
process.send({memory: process.memoryUsage(), process: process.pid});
})
}

  这个例子中,工作进程报告自己的内存使用量,当子进程使用了过多内存时,主进程会发送一条警告到日志中去。这让node主进程有控制的能力,也带来了好处。这个消息传递接口也允许主进程把消息发回给工作进程。当然,我们还能用消息传递做更多的事情。

nodejs:使用多处理器的更多相关文章

  1. 架构选型之Nodejs与Java

    前言: 身边越来越多的同事谈论Nodejs,谈其异步IO.事件回调.前后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,期望能够使用一种语言节省成本快速完成需求开发.与其他项目组的同事 ...

  2. NodeJs之OS

    OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...

  3. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  4. NodeJs之调试

    关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...

  5. NodeJs在Linux下使用的各种问题

    环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...

  6. NodeJs之child_process

    一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...

  7. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  8. 图片访问实时处理的实现(nodejs和php)

    我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...

  9. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

随机推荐

  1. mac下配置openfire

    下载 在浏览器中打开如下网址http://www.igniterealtime.org/downloads/index.jsp,根据你的操作系统选择对应的版本进行下载,这里我是在mac下配置的,所以选 ...

  2. VS2015 Android

    最近安装了VS2015,体验了一下android 的开发,按模板创建运行了个,试下效果很不错.也可以可视化设计.但昨天再次打开或创建一个android程序后,设计界面直接不能显示,显示错误:(可能是升 ...

  3. 方法的重载(overload)和重写(override)的区别

    方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.如 ...

  4. 潜入ICU的四逆汤

    制附子50克(先煎2小时).干姜15克.炙甘草10克.桂枝10克.上好肉桂10克(后下).煎取药液300毫升,分三次鼻饲.这是昨天我给A先生病危的父亲开的处方:四逆汤加肉桂.桂枝. 昨天上午的门诊到2 ...

  5. git学习系列--六分之一

    版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统,可以对任何类型的文件进行版本控制. 细说分布式版本控制系统 在这类系统中,像 Git,Mercurial,Bazaar 以 ...

  6. 关于oracle的相关基础语句

    ----给表的字段添加描述COMMENT ON COLUMN 数据库名称.表名.表字段 IS '字段描述'; ---设置自动增长 CREATE SEQUENCE emp_sequence INCREM ...

  7. ios异常(crash)输出

    最近突然想起友盟的sdk附带的一个功能:将闪退异常情况上报服务器,(stackflow,github)找了一些资料,自己写了一个demo,想起来好久没有写过blog了,顺便分享. 其实不止是ios,a ...

  8. js图片变换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. NRF51822之修改设备名(掉电不保存)

    主要代码 /**@brief Function for handling the Application's BLE Stack events. * * @param[in] p_ble_evt Bl ...

  10. 正则表达式python和C++对比

    pattern格式(基本通用): pattern格式 符号 说明 ^ 匹配开头 $ 匹配结尾 . 匹配任意一个字符 [...] 匹配任意一个指定的字符 [^...] 匹配任意一个非指定的字符 * 匹配 ...