Node.js中创建和管理外部进程详解_node.js(4)
1.+1 应用:一个简单的应用程序,可以从标准输入接收整型,然后相加,再把相加以后的结果输出到标准输出流。这个应用作为一个简单的计算服务, 把Node进程模拟成一个可以执行特定工作的外部服务。
2.测试+1应用的客户端,发送随机整型,然后输出结果。用来演示Node进程如何生成一个子进程然后让它执行特定的任务。
用下面例8-6的代码创建一个名为plus_one.js的文件:
例 8-6: +1 应用程序(chapter8/06_plus_one.js)
// 恢复默认是暂停状态的标准输入流
process.stdin.resume();
process.stdin.on('data', function(data) {
var number;
try {
// 将输入数据解析为整型
number = parseInt(data.toString(), 10);
// +1
number += 1;
// 输出结果
process.stdout.write(number + "\n");
} catch(err) {
process.stderr.write(err.message + "\n");
}
});
上面代码里,我们等待来自stdin标准输入流的数据,每当有数据可用,就假设它是个整型并把它解析到一个整型变量里,然后加1,并把结果输出到标准输出流。
可以通过下面命令来运行这个程序:
$ node plus_one.js
运行后程序就开始等待输入,如果你输入一个整数然后按回车,就会看到一个被加1以后的数字被显示到屏幕上。
可以通过按Ctrl-C来退出程序。
一个测试客户端
现在你要创建一个Node进程来使用前面的“+1应用”提供的计算服务。
首先创建一个名为plus_one_test.js的文件,内容见例8-7:
例 8-7: 测试+1应用(chapter8/07_plus_one_test.js)
var spawn = require('child_process').spawn;
// 生成一个子进程来执行+1应用
var child = spawn('node', ['plus_one.js']);
// 每一秒调用一次函数
setInterval(function() {
// Create a random number smaller than 10.000
var number = Math.floor(Math.random() * 10000);
// Send that number to the child process:
child.stdin.write(number + "\n");
// Get the response from the child process and print it:
child.stdout.once('data', function(data) {
console.log('child replied to ' + number + ' with: ' + data);
});
}, 1000);
child.stderr.on('data', function(data) {
process.stdout.write(data);
});
从第一行到第四行启动了一个用来运行“+1应用”的子进程,然后使用setInterval函数每秒钟执行一次下列操作:
1..新建一个小于10000的随机数
2.将这个数字作为字符串传递给子进程
3.等待子进程回复一个字符串
4.因为你想每次只接收1个数字的计算结果,因此需要使用child.stdout.once而不是child.stdout.on。如果使用了后者,会每隔1秒注册一个data事件的回调函数,每个被注册的回调函数都会在子进程的stdout接收到数据时被执行,这样你会发现同一个计算结果会被输出多次,这种行为显然是错的。
在子进程退出时接收通知
当子进程退出时,exit事件会被触发。例8-8展示了如何监听它:
例 8-8: 监听子进程的退出事件 (chapter8/09_listen_child_exit.js)