Node以单线程的方式运行,经过事件驱动的方式来减小开销车,处理并发。咱们能够注册多进程,而后监听子进程的事件来实现并发javascript
Node提供了child_process模块来处理子进程,有三种形式java
slave.jsnode
var f = function(){ // process全局能够得到当前进程的信息 console.log("进程", process.argv[2] + "执行结束") } // 延迟运行,现node的注册机制和并发 setTimeout(f, 1000*(3-process.argv[2]));
master.jsbash
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:
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版本一致并发
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) //打印退出码 }) }
运算结果ui
进程 2执行结束 子进程已经退出 0 进程 1执行结束 子进程已经退出 0 进程 0执行结束 子进程已经退出 0
值得注意的是,fork的子进程输出内容输出在父进程的同一个terminal中spa