nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核CPU机器上的性能表现。本文将介绍利用cluster模块创建的多线程如何共享数据的问题。
进程间数据共享
首先举个简单的例子,代码如下:
var cluster = require('cluster');
var data = 0;//这里定义数据不会被所有进程共享,各个进程有各自的内存区域
if (cluster.isMaster) { //主进程
var numCPUs = require('os').cpus().length;
for (var i = 0; i < numCPUs; i++) {
var worker = cluster.fork();
data++;
console.log('DATA VALUE in MainProcess: %d ' , data);
} else { //子进程,会被调用numCPUs次
data++;
console.log('DATA VALUE in ChildProcess %d: %d ' cluster.worker.id, data);
运行结果如下:
为什么我们在主进程代码块以及子进程代码块之外来声明的变量不应该是全局变量么?答案是否定的。因为每个进程在内存都有各自的区域,因此data++操作是在各自的区域内进行的,也就是说变量data没被共享。那么怎么来在各进程之间共享数据呢?来看下面的代码:
var cluster = require('cluster');
var http = require('http');
if (cluster.isMaster) {
var numCPUs = require('os').cpus().length;
var data = 0;
// 启动多个进程.
for (var i = 0; i < numCPUs; i++) {
//增加一个进程
var worker_process = cluster.fork();
//侦听子进程的message事件
worker_process.on('message', function(msg) {
if (msg.cmd && msg.cmd == 'notifyRequest') {
data++;
console.log('DATA VALUE : %d ', data);
} else {
process.send({ cmd: 'notifyRequest' });
运行结果如下:
因此如果需要共享数据,需要在进程间使用消息通知来达到这个目的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
前述nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核CPU机器上的性能表现。本文将介绍利用cluster模块创建的多线程如何共享数据的问题。进程间数据共享首先举个简单的例子,代码如下:var cluster = require('cluster');var data = 0;//这里定义数据不会被所有进程共...
最近破事比较多,博客更新收到了影响。
业务需要,学习了一下
Nodejs
里面的Process
变量
和Node
cluster
变量
,收获不小。
这文章呢是针对
cluster
模块
的,为什么要提process呢,因为这下面一部分代码需要用到process.
首先process是全局
变量
,是指
nodejs
主进程,所以呢上面的事件(message listening)都是相对于
cluster
中
的maste
现在的
cluster
已经可以说完全做到的负载均衡,在做代理服务和http服务器的时候能够讲服务器性能发挥到最大。来看一下具体的实现吧
var
cluster
= require('
cluster
');
var http = require('http');
var numCPUs = require('os').cpus().length;
if ...
如果你正在使用一系列node
模块
,或许是一个像Express.js一样的框架,突然需要使用几个全局
变量
。怎样在
nodejs
里创建全局
变量
呢?
对此最常见的建议是“不使用‘var’关键字声明一个
变量
”或“给object对象添加一个
变量
”或“给OBJECT对象添加一个
变量
”。你会使用哪种方式呢?
首先,让我们分析下global对象。打开一个终端,启动一个node命令
2、process:该对象表示Node所处的当前进程,允许开发者与该进程互动。
3、console:指向Node内置的console
模块
,提供命令行环境
中
的标准输入、标准输出功能。
二、全局函数:
1、定时器函数:共有4个,分别是setTimeout(), clearTim...
Node.js可以使用child_process
模块
创建子进程,并使用子进程的功能来独立运行
模块
。
可以使用child_process.fork()方法来创建子进程,该方法将启动另一个Node.js进程,并在该进程
中
运行指定的
模块
。
例如,以下代码将启动一个新的Node.js进程并在其
中
运行名为“example.js”的
模块
:
const { fork } = require('child_process');
const child = fork('example.js');
在子进程
中
执行的代码可以使用process.send()方法将消息发送回主进程,而主进程可以侦听子进程发送的消息,并使用child.on('message', ...)来接收它们,如下所示:
// 在子进程
中
process.send('hello from child');
// 在主进程
中
child.on('message', message => {
console.log(`received message from child: ${message}`);
因此,使用child_process
模块
可以将一个
模块
单独放到一个进程
中
执行,并与主进程进行通信。