nodejs:使用多处理器

  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主进程有控制的能力,也带来了好处。这个消息传递接口也允许主进程把消息发回给工作进程。当然,我们还能用消息传递做更多的事情。

时间: 2024-08-29 00:54:48

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

Node.js 使用angularjs取得Nodejs http服务端返回的JSON数组示例

server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http"); // 创建服务器,创建HTTP服务器要调用http.createServer()函数,它只有一个参数,是个回调函数,服务器每次收到http请求后都会调用这个回调函数.服务器每收到一条http请求,都会用新的request和response对象触发请求函数. var server=http.createS

Nodejs + MongoDb

一.搭建开发环境 进入 http://nodejs.org 下载开发环境 http://Expressjs.com 下载安装Express  npm install -g express 继续安装ejs:npm install ejs 如果要想运行Node.js程序,则现在只能够使用“node app.js”,而这样的运行方式,如果在app.js文件修改之后往往需要重新启动才可以加载新的内容,这对于开发是非常不方便的, 为此,可以使用一个supervisor组件包,它可以动态的加载修改之后的开发

nodejs应用在linux服务器中的部署

1.(可选)添加用户: addgroup wmui添加用户组useradd -d /home/wmui -s /bin/bash -m wmui创建wmui用户passwd wmui设置密码,如果忘记密码,也可用此命令重置密码usermod -a -G wmui wmui 添加用户到组visudo 设置sudo权限然后会跳转到下面页面 root ALL=(ALL:ALL) ALL下面添加wmui ALL=(ALL) NOPASSWD: ALLctrl+x保存退出接下来打开一个新的窗口,测试是否登

centos 6.5安装NodeJS

centos 6.5安装NodeJS 下载 可以在本地下载node.js最新版,然后通过ftp工具上传到服务器,或者直接在服务器终端使用wget命令下载(我当时下载的是node-v7.5.0-linux-x86版本,其他版本请查看上面链接然后替换即可): $ wget http://nodejs.org/dist/latest/node-v7.5.0-linux-x86.tar.gz 解压 进入服务器终端,找到上传或者下载的安装包,解压 $ tar -zvxf node-v7.5.0-linux

NodeJS之queryString

前面的话 无论是前端还是后端,经常出现的应用场景是URL中参数的处理.nodeJS的queryString模块提供了一些处理 query strings 的工具.本文将详细介绍nodeJS中的queryString var querystring = require('querystring'); /* { unescapeBuffer: [Function], unescape: [Function: qsUnescape], escape: [Function], encode: [Func

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

引用nodejs的url模块实现url路由功能

我们在本地创建服务器之后需要写不同的后缀名来访问同一个站点的不同页面,如果不实现路由功能.则每次访问localhost:3000 不论后面写什么  比如localhost:3000/index.localhost:3000/detail...最终都会访问同一个地址:而用url路由则可以实现访问不同的页面:在实现url路由功能之前,首先需要引入url模块:const url = require('url');  nodejs 为我们提供了url模块,并且提供了url模块的一些方法: 最终要的方法是

nodejs入门 多人聊天视频

Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js. 下边是nodejs的安装和多人聊天系统, windows环境下 1.安装nodejs nodejs的官网 https://nodejs.org/en/ 下载nodejs最新版本一步步安装就好. 没有什么可说的. 2.安装完成以后查看当前nodejs的版本和测试nodejs时候成功 查看nodejs版本. cmd命令行窗口 ---> node -v 测试nodejs 是否

NodeJs编写小爬虫

一,爬虫及Robots协议 爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化. robots.txt是一个文本文件,robots是一个协议,而不是一个命令.robots.txt是爬虫要查看的第一个文件.robots.txt文件告诉爬虫在服务器上什么文件是可以被查看的,搜索机器人就会按照该文件中的内容来确定访问的范围. 如上图,我们可以在网站中直接访问robots.txt文件查看网站禁止访问和允许访问的文件. 二,使用NodeJs爬去