nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核CPU机器上的性能表现。本文将介绍利用cluster模块创建的多线程如何共享数据的问题。
进程间数据共享
首先举个简单的例子,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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没被共享。那么怎么来在各进程之间共享数据呢?来看下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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'
});
}
|
运行结果如下:
因此如果需要共享数据,需要在进程间使用消息通知来达到这个目的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
转载自:
https://www.jb51.net/article/96929.htm
Nodejs中解决cluster模块的多进程如何共享数据问题 更新时间:2016年11月10日 08:44:20 作者:黄明恩 本篇文章主要介绍了Nodejs中解决cluster模块的多进程如何共享数据问题,有需要的可以了解一下。 前述nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程...
const
cluster
= require('
cluster
');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (
cluster
.isMaster) {
console.log(`Master
进程
${process.pid} 正在运行`);
Node.js的标准API没有提供
进程
共享
内存,然而通过IPC接口的send方法和对message事件的监听,就可以实现一个多
进程
之间的协同机制,通过通信来操作
共享
内存。
##IPC的基本用法:
// worker
进程
发送消息
process.send(‘读取
共享
内存');
// master
进程
接收消息 -> 处理 -> 发送回信
cluster
.on('online', function (worker) {
// 有worker
进程
建立,即开始监听message事件
worker.on(‘message', function(data) {
// 处理来自w
if (
cluster
.isMaster) {
// CPU 核数的一半为子
进程
总数
for (let i = 0; i < require('os').cpus().length / 2; i++) {
createWorker();
// 如果有子
进程
退出,5s之后重新创建一个子
接着前两篇关于 egg-core 源码分析的文章 egg-core 源码分析一 和 egg-core 源码分析二,今天来看一下 egg-
cluster
的源码实现逻辑。
NodeJs
中
javascript 的执行是单线程的,所以一个
进程
只能使用一个 CPU,为了最大可能的使用服务器资源,一般我们可以使用下面三种方式实现:
同一台机器上部署多个 Node 服务,使用不同的端口,然后用 Ngin...
双线程FunProc1与FunProc2
共享
数据
,
数据
用类封装。
共享
数据
在读写时需要上锁,只有解锁进入临界区才能操作
共享
数据
。FunProc1与FunProc2类似于产生者与消费者的关系,如果FunProc1(sleep(t1))与FunProc2(sleep(t2))两个线程睡眠时间不一样,输出结果会有差别。#include <iostream>
#include <queue>
#include
在现在的大型网站
中
,如何实现多台服务器
中
的session
数据
共享
呢
当使用多台服务器架设成集群之后,我们通过负载均衡的方式,同一个用户(或者ip)访问时被分配到不同的服务器上,假设在A服务器登录,如果在B服务器拿不到用户的登录信息session。这时访问到B服务器时就出现未登录情况。
所以如何对于这种情况做到
共享
session至关重要。
以下给出一些
解决
方案:(来源网络...
你可以通过以下几个方面来突出使用
Nodejs
重构
数据
写入
模块
:
1. 强调
Nodejs
的优点:
Nodejs
是一种快速、高效、轻量级的JavaScript运行环境,适合处理I/O密集型任务,如
数据
读写。使用
Nodejs
重构
数据
写入
模块
可以提高程序的性能和效率。
2. 说明重构前的
问题
:如果之前的
数据
写入
模块
存在性能瓶颈、代码冗余、可维护性差等
问题
,可以在简历
中
突出这些
问题
,并说明使用
Nodejs
重构后如何
解决
这些
问题
。
3. 举例说明重构后的效果:可以通过具体的案例或项目来说明使用
Nodejs
重构
数据
写入
模块
的效果,如提高了程序的响应速度、减少了代码量、提高了可维护性等。
总之,突出使用
Nodejs
重构
数据
写入
模块
的优点和效果,以及
解决
了哪些
问题
,可以让你的简历更具说服力和吸引力。