NodeJS多进程

Node以单线程的方式运行,通过事件驱动的方式来减少开销车,处理并发。我们可以注册多进程,然后监听子进程的事件来实现并发

简介

Node提供了child_process模块来处理子进程,有三种形式

  • exec:直接在terminal里面开启进程
  • spawn:指定命令+参数
  • fork:与spawn类似,默认node执行,并且父子间建立通信管道,可以实现进程间通信

exec

slave.js

var f = function(){
// process全局可以获得当前进程的信息
console.log("进程", process.argv[2] + "执行结束")
}
// 延迟运行,现node的注册机制和并发
setTimeout(f, 1000*(3-process.argv[2]));

master.js

const child_process = require('child_process')

for (var id = 0; id<3; id++){
// 开启子进程,并处理输出
var subProcess = child_process.exec('node slave.js '+id,function (error, stdout, stderr) {
if (error){
console.error(error)
}
else{
console.log('stdout: '+stdout)
console.log('stderr: '+stderr)
}
})
// 监听三个进程
subProcess.on('exit',function (code) {
console.log("子进程已经退出 "+code) //打印退出码
})
}
子进程已经退出 0
stdout: 进程 2执行 stderr:
子进程已经退出 0
stdout: 进程 1执行 stderr:
子进程已经退出 0
stdout: 进程 0执行 stderr:

spawn

const child_process = require('child_process')

for (var id = 0; id<3; id++){
// 开启子进程,并处理输出,这种传参方式更加规整一些
var subProcess = child_process.spawn('node', ['slave.js', id])
// 监听流
subProcess.stdout.on('data',function (data) {
console.log('stdout: '+data)
}) subProcess.stderr.on('data',function (data) {
console.log('stderr: '+data)
}) // 监听三个进程
subProcess.on('exit',function (code) {
console.log("子进程已经退出 "+code) //打印退出码
})
}

运算结果与exec版本一致

fork

const child_process = require('child_process')

for (var id = 0; id<3; id++){
// 开启子进程,并处理输出
var subProcess = child_process.fork('slave.js', [id])
// 监听三个进程
subProcess.on('exit',function (code) {
console.log("子进程已经退出 "+code) //打印退出码
})
}

运算结果

进程 2执行结束
子进程已经退出 0
进程 1执行结束
子进程已经退出 0
进程 0执行结束
子进程已经退出 0

值得注意的是,fork的子进程输出内容输出在父进程的同一个terminal中

NodeJS多进程的更多相关文章

  1. nodeJs多进程Cluster

    在前端页面中,如果我们想进行多进程,我们会用到WebWorker,而在NodeJs中,我们如果想充分利用服务器核心资源,我们会用到Node中Cluster模块 直接上代码吧: const cluste ...

  2. 浅谈NodeJS多进程服务架构基本原理

    阅读目录 一:nodejs进程进化及多进程架构原理 二:node中child_process模块实现多进程 三:父子进程间如何通信? 四:理解cluster集群 回到顶部 一:nodejs进程进化及多 ...

  3. NodeJs多进程和socket.io通讯-DEMO

    一.开启多进程 const os = require('os'); const cp = require('child_process'); const forkList = {}; const fo ...

  4. nodejs review-03

    39 Serve different file types with our server 处理文件类型 function content_type(filename) { var ext = pat ...

  5. nodejs(二) --- 重要知识点回顾

    1. 运行一个nodejs文件, 如一个js文件中只含有console.log("hello world");的文件,我们再git里运行node,即 node hello.js 即 ...

  6. node.js WebService异常处理(domain)以及利用domain实现request生命周期的全局变量

    成熟的Web Service技术,例如Fast CGI.J2EE.php,必然会对代码异常有足够的保护,好的Web必然会在出错后给出友好的提示,而不是莫名其妙的等待504超时.而node.js这里比较 ...

  7. 自建简易FaaS平台

    近些年来,传统的 IaaS.PaaS 已经无法满足人们对资源调度的需求了.各大云厂商相继开始推出自家的 Serverless 服务.Serverless 顾名思义,它是"无服务器" ...

  8. 关于Nodejs的多进程模块Cluster

    关于Nodejs的多进程模块Cluster   前述 我们都知道nodejs最大的特点就是单进程.无阻塞运行,并且是异步事件驱动的.Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并 ...

  9. Nodejs中cluster模块的多进程共享数据问题

    Nodejs中cluster模块的多进程共享数据问题 前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核 ...

随机推荐

  1. [转] ReactJS之JSX语法

    JSX 语法的本质目的是为了使用基于 xml 的方式表达组件的嵌套,保持和 HTML 一致的结构,语法上除了在描述组件上比较特别以外,其它和普通的 Javascript 没有区别. 并且最终所有的 J ...

  2. HL7消息部分笔记

    1.关于HL7标准 HL7是HealthLevel7的缩写,主要用于医疗领域不同的系统.应用之间的信息传递.规范各个系统间的信息传递格式. 2.字段含义: Z信息段: Z信息段是指与HL7第二版标准其 ...

  3. 用jQuery实现Ajax

    前置知识:ajax原理,json字符串进行信息传递. Ajax主要的功能是实现了浏览器端 异步 访问服务器:通过浏览器的XMLHttpRequest对象发出小部分数据,与服务端进行交互, 服务端返回小 ...

  4. 背包的一些idea

    题解: 给出n个物品,每次能使用l-r之间的物品,问能不能表示出k,m次询问 k<=100,m,n=1e5 想了线段树分治 发现是k^2(n+m)logn claris告诉我可以直接分治 我们对 ...

  5. 3.ELK 之elasticsearch CRUD

    名词介绍 index: type: document: 数据类型: 索引(index)创建示例 .   type的创建(7.x之后)将会去掉该内容,点我看为什么? 参考脚本: mapping使用 其他 ...

  6. shell常用监控脚本

    1.cpu空闲脚本 top -b -n1 |grep 'Cpu'|awk '{print $5}'|sed 's/%//'|sed 's/id,//' 变量赋值 cpu_id='top -b -n1 ...

  7. 通过impala更改Kudu表属性

    开发人员可以通过更改表的属性来更改 Impala 与给定 Kudu 表相关的元数据.这些属性包括表名, Kudu 主地址列表,以及表是否由 Impala (内部)或外部管理. Rename an Im ...

  8. 从入门到深入FIDDLER 2

    在开发的过程中使用过不少的HTTP网络抓包工具,如:HTTPAnalyzer,HttpWatch. Fiddler几乎囊括了大部分的抓包请求,当然最给力的还是它的断点调试功能,尤其还有使用本地文件代替 ...

  9. 高性能之js

    alloyteam团队的总结: 链接在:http://www.alloyteam.com/2012/10/high-performance-front-end-high-performance-jav ...

  10. 洛谷3825 [NOI2017]游戏 2-sat

    原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...