Node.js多进程的实现及进程间的通讯

 2015年06月04日    1364     声明


上篇文章介绍了Node.js使用child_process模块实现多进程和进程间的管理。本文将通过一个实例介绍child_process模块的使用,本文侧重进程间的通讯部分,做为对上篇内容的补充。

父进程可以从子进程的输出流中获取数据,父进程也可以向子进程的标准输入流中写入数据。这相当于向子进程发送数据,而子进程可以使用stdin来监听数据。程序功能如下:

  1. 本程序是个计数程序,包括主进程master.js和子进程counter.js两个文件。
  2. 主进程用于启动主进程和子进程。
  3. 主进程每隔2秒向子进程发送一个随机数。子进程收到数据后,计数器+1,然后返回收到的数据及收到数据的总次数。子进程收到10次数据后,进程退出。
  4. 主进程监听子进程的数据和子进程的状态。子进程退出后,主进程程也退出。


子进程首先应该恢复流,stdin流默认是暂停状态。子进程模块文件counter.js代码如下:

//解除stdin流的暂停状态
process.stdin.resume();	
//计数器,统计收到消息的次数
var counter = 0;
process.stdin.on('data',function (data){
    counter += 1;

    //收到10次父进程发来的数据后,子进程退出
    if(counter>10){
	process.exit();
    }
    try{
	process.stdout.write('共收到'+ counter + '次数据,本次发来的数据是:'+ data+'\n');
    }catch(err){
	process.stderr.write(err.message+'\n');
    }
})

主进程使用spawn方法启动子进程,监听子进程的sdtout流、sdterr流、及退出事件等。主进程模块文件master.js代码如下:

var child_process = require('child_process');
var child = child_process.spawn('node',['-f','counter.js']);

setInterval(function(){
    var number=Math.floor(Math.random()*1000);

    //与子进程通讯,发送一个随机数
    child.stdin.write(number+'\n');

    //使用once监听子进程返回的数据,使用on将导致多次监听注册
    child.stdout.once('data',function(data){
	console.log('发给子进程的数据:'+number+'\n 收到的数据是:'+data);
    })
},2000)

//监听子进程的标准错误输出
child.stderr.on('data',function(data){
    process.stdout.write(data);
})

//监听子进程的退出信息
child.on('close',function(data){
    console.log('子进程退出了');
    //主进程退出
    process.exit();
})

开发完成,Node启动主进程查看效果吧。

 node master.js