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中