NodeJS父进程与子进程资源共享原理与实现方法

本文实例讲述了NodeJS父进程与子进程资源共享原理与实现方法。分享给大家供大家参考,具体如下:

实验目标:实现父进程与子进程间资源共享

使用模块:cluster

简介:建立node集群,实现多进程,利用child_process来实现IPC,解决多核利用率,提高性能。

原理:

1 Master-worker主从模式的多进程架构

2 fork()复制进程,充分利用cpu资源(根据内核数决定)

3 每个进程都有自己的区域,如果在各自区域内执行操作,资源并未共享。通过监听message事件和send实现消息传递,达到资源共享的效果

4  globalDataError为错误的资源共享方式, globalDataSuccess为正确的资源共享方式。

实现代码:

var cluster = require('cluster');
var cpus = require('os').cpus();
// 传递的事件名
var triggerEvent = {
    inc: 'inc',
    dec: 'dec'
}
// 错误的数据共享方式
var globalDataError = 0;
if (cluster.isMaster) {
  // 正确的数据共享方式
  var globalDataSuccess = 0;
  globalDataError++;
  // 启动多个进程,取决于内核数
  for (var i = 0; i < cpus.length; i++) {
    var worker = cluster.fork();
    worker.on('message', function(msg) {
      switch (msg) {
        case triggerEvent.inc:
          globalDataSuccess++;
          console.log('globalDataSuccess = ', globalDataSuccess);
          break;
        case triggerEvent.dec:
          globalDataSuccess--;
          console.log('globalDataSuccess = ', globalDataSuccess);
          break;
      }
    });
  }
  console.log('Master globalDataError = ', globalDataError);
} else {
  globalDataError++;
  console.log('Worker globalDataError = ', globalDataError);
  process.send(triggerEvent.dec);
  process.send(triggerEvent.inc);
}

希望本文所述对大家nodejs程序设计有所帮助。

(0)

相关推荐

  • 用Nodejs搭建服务器访问html、css、JS等静态资源文件

    为了测一个附近门店的功能,需要配置一下服务器进行测试.本来打算用apache的,后来想自己是做前端的,好久没有用过Nodejs了何不用所学的知识自己配一下呢,说动手就手. 第一步,俗话说的好,工欲善其事,必先利其器.既然要用node+express配置服务器,如果电脑上没有的话自然要先安装这两个大宝贝啦. 1.安装node.到Node官网下载安装即可,直接下一步下一步就完成了. 2.npm初始化项目.打开终端,输入npm init -y即可.注意:如果不输入-y要自己写一些配置,写了-y会默认直

  • 详解Nodejs之静态资源处理

    前言 刚开始用Nodejs写简单的web服务器的时候,总是感觉少了点什么. 原来,我一直是在页面上输出什么Hello World!啊, It Works.之类的了.还确实没有处理关于CSS, JS这些引用的静态相关的资源. 一开始觉得处理这些东西应该会非常的easy,结果发现不仅仅是这么回事.途中也遇到了一些人们经常可能会犯的想当然的错误.于是我就决定好好的记录一下关于Nodejs中对于静态资源的处理. 着眼于问题 重现问题 先来展示一下目录结构吧. E:\CODE\NODEJS\LEARN\W

  • 利用node.js如何创建子进程详解

    前言 node本身为单进程,并使用驱动模式处理并发,为了解决单进程在多核cpu上的资源浪费,node提供了cluster和child_process模块来创建多个子进程. Node.js是单线程的,对于现在普遍是多处理器的机器是一种浪费,怎么能利用起来呢?于是child_process模块出现了.child_process模块可以在其他进程上产生.派生,并执行工作. child_process模块提供了一个ChildProcess的新类,它可以作为从父进程访问子进程的表示形式.Process模块

  • nodejs 子进程正确的打开方式

    因为库太拙了,需要在 nodejs 里调用子进程来获取数据.然而看到 child_process 的文档真是头疼,这么多种启动子进程的方法直接推到人面前,也没个解释,命名也十分无用.只能一个个地查看详细说明来找到应该使用的那个--所以我整理了一下. 首先是同步创建子进程的那几个函数.会阻塞 nodejs 的主循环.无用.(要是写小脚本的话我直接上 shell 或者 Python 了,干嘛跟自己过不去呢.) exec :调用 shell 来执行命令的.这部分跟「exec」这个词的 UNIX/C 语

  • nodejs构建本地web测试服务器 如何解决访问静态资源问题

    直接打开html文件,是以file:///方式打开的,这种方式很多时候会遇到跨域的问题,因此我们一般会搭建一个简易的本地服务器,来运行测试页面. 一.构建静态服务器 1.使用express模块 建立个js文件,命名server,内容代码如下: var express = require('express'); var app = express(); var path = require('path'); //指定静态资源访问目录 app.use(express.static(require('

  • 详解从Node.js的child_process模块来学习父子进程之间的通信

    child_process模块提供了和popen(3)一样的方式来产生自进程,这个功能主要是通过child_process.spawn函数来提供的: const spawn = require('child_process').spawn; const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data'

  • 浅谈Node.js 子进程与应用场景

    背景 由于ons(阿里云 RocketMQ 包)基于 C艹 封装而来,不支持单一进程内实例化多个生产者与消费者,为了解决这一问题,使用了 Node.js 子进程. 在使用的过程中碰到的坑 发布:进程管理关闭主进程后,子进程变为操作系统进程(pid 为 1) 几种解决方案 将子进程看做独立运行的进程,记录 pid,发布时进程管理关闭主进程同时关闭子进程 主进程监听关闭事件,主动关闭从属于自己的子进程 子进程种类 spawn:执行命令 exec:执行命令(新建 shell) execFile:执行文

  • 利用NodeJS的子进程(child_process)调用系统命令的方法分享

    NodeJS子进程简介 NodeJS子进程提供了与系统交互的重要接口,其主要API有: 标准输入.标准输出及标准错误输出的接口. NodeJS子进程简介 NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有: 标准输入.标准输出及标准错误输出的接口 child.stdin 获取标准输入 child.stdout 获取标准输出 child.stderr 获取标准错误输出 获取子进程的PID:child.pid 提供生成子进程的重要方法:child_process.spawn(cmd,

  • 使用Node.js搭建静态资源服务详细教程

    对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解.那就开始吧,让我们的双手沾满网络请求! Note: 当然在项目中如果有使用express框架,用express.static一行代码就可以达到目的了: app.use(express.static('public')) 这里我们要实现的正是express.static背后所做工作的一部分,建议同步阅读该模块源码. 基本功能 不急着写下第一行代码,而是先梳理一下就基

  • NodeJS父进程与子进程资源共享原理与实现方法

    本文实例讲述了NodeJS父进程与子进程资源共享原理与实现方法.分享给大家供大家参考,具体如下: 实验目标:实现父进程与子进程间资源共享 使用模块:cluster 简介:建立node集群,实现多进程,利用child_process来实现IPC,解决多核利用率,提高性能. 原理: 1 Master-worker主从模式的多进程架构 2 fork()复制进程,充分利用cpu资源(根据内核数决定) 3 每个进程都有自己的区域,如果在各自区域内执行操作,资源并未共享.通过监听message事件和send

  • php 多进程编程父进程的阻塞与非阻塞实例分析

    本文实例讲述了php 多进程编程父进程的阻塞与非阻塞.分享给大家供大家参考,具体如下: php中进程的阻塞,主要是父进程等待子进程退出. 1.php代码如下: <?php //定义进程数量 define('FORK_NUMS', 5); //用于保存进程pid $pids = array(); //我们创建5个子进程 for ($i = 0; $i < FORK_NUMS; ++$i) { $pids[$i] = pcntl_fork(); if ($pids[$i] == -1) { die

  • WIN32程序获取父进程ID的方法

    学过windows程序设计的人都知道,windows中的进程是可以有父子关系的,拥有父子关系的进程,一旦父进程结束,子进程有会随之退出.但是如果进程之间没有父子关系,我们如何让子进程在父进程退出是也同时跟着退出呢?方法有很多,本文介绍其中的一种利用父进程ID的方案,实现的原理很简单:先获取父进程的ID,然后通过ID来获取父进程Handle,通过监视父进程的Handle来决定子进程是否退出.所以,这里的关键就是如何获取父进程的ID. 为了获取父进程ID,这里需要用到一个微软未公开的API: NTS

  • Nginx进程管理和重载原理详解

    进程结构图 Nginx是多进程结构,多进程结构设计是为了保证Nginx的高可用高可靠,包含: master进程:父进程,负责worker进程的管理 worker进程:子进程,worker进程一般配置与服务器CPU核数相同,worker进程用来处理具体请求. cache进程:也是子进程,包括cache manager和cache loader进程,主要是反向代理做缓存使用. 注:多进程相对于多线程之所以能够保证高可用与高可靠是因为进程间地址空间是独立的,进程间的任务不会相互影响,相对多线程更加耗费

  • php脚本守护进程原理与实现方法详解

    本文实例讲述了php脚本守护进程原理与实现方法.分享给大家供大家参考,具体如下: 思路: 1. while 循环,若当前没有数据要操作可以休眠: 2. crontab 脚本每隔固定时间段执行该脚本,执行时先检测是否已在执行,若无 执行,有则 跳过. 3. nohup  后台执行 4. flock -xn  加锁 实例: 要执行代码:index.php <?php set_time_limit(0); //死循环 while(1) { $message = '1111111' . "\n&q

  • Android跨进程抛异常的原理的实现

    今天接到了个需求,需要用到跨进程抛异常. 怎样将异常从服务端抛到客户端 也就是说在Service端抛出的异常需要可以在Client端接收.印象中binder是可以传异常的,所以aidl直接走起: // aidl文件 interface ITestExceptionAidl { boolean testThrowException(); } // service端实现 public class AidlService extends Service { @Nullable @Override pu

  • python多进程 主进程和子进程间共享和不共享全局变量实例

    Python 多进程默认不能共享全局变量 主进程与子进程是并发执行的,进程之间默认是不能共享全局变量的(子进程不能改变主进程中全局变量的值). 如果要共享全局变量需要用(multiprocessing.Value("d",10.0),数值)(multiprocessing.Array("i",[1,2,3,4,5]),数组)(multiprocessing.Manager().dict(),字典)(multiprocessing.Manager().list(ran

  • C#结束进程及子进程

    这是个我在C#调用批处理文件时遇到的问题.首先我通过Process.Start方法调用一个批处理文件,那个批处理文件里面则调用了一大堆程序.当退出C#程序时,我在程序中结束杀掉了那个批处理文件的Process,但是,那个批处理所调用的子进程却无法像直接调用批处理文件那样随着批处理文件的进程一起被杀掉,而是自动向上提升成为了独立的进程. 在网上查了一下,可以通过NtQueryInformationProcess函数查询子进程的信息,并同时也查到了一段杀掉进程及所有子进程的C#代码,有需要的朋友可以

  • python进程的状态、创建及使用方法详解

    本文实例讲述了python进程的状态.创建及使用方法.分享给大家供大家参考,具体如下: 进程以及状态 1. 进程 程序:例如xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元. 不仅可以通过线程完成多任务,进程也是可以的 2. 进程的状态 工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态 就绪态:运行的条件都已经慢去,正在等在cpu执行 执行态:cpu

  • JS前端模块化原理与实现方法详解

    本文实例讲述了JS前端模块化原理与实现方法.分享给大家供大家参考,具体如下: 1.什么是前端模块化 模块化开发,一个模块就是一个实现特定功能的文件,有了模块我们就可以更方便地使用别人的代码,要用什么功能就加载什么模块. 2.模块化开发的好处 1)避免变量污染,命名冲突 2)提高代码利用率 3)提高维护性 4)依赖关系的管理 3.前端模块化的进程 前端模块化规范从原始野蛮阶段现在慢慢进入"文艺复兴"时代,实现的过程如下: 3.1 函数封装 我们在讲到函数逻辑的时候提到过,函数一个功能是实

随机推荐