Node.JS 以单线程的模式运行, 使用事件驱动来处理异步 IO 并发(底层是多线程的线程池).
然而, 要是 Node 运行在一个多核 CPU 上, 如何让 Node 充分利用多核的优势, 并行地处理任务? 我们可以使用多进程. 由于 Node 的单线程特性, 开启多进程后, Node 也获得多线程的执行能力.
Node 提供了 child_process 模块来创建子进程.
Node 创建子进程的 4 种方式:
1,spawn()
创建一个子进程来执行命令
2,exec()
创建一个子进程来执行命令, 和 spawn()不同的是方法参数不同, 它可以传入回调函数来获取子进程的状态
3,execFile()
启动一个子进程来执行指定文件. 注意, 该文件的顶部必须声明 SHEBANG 符号 (#!) 用来指定进程类型.
4,fork()
和 spawn()类似, 不同点在于它创建 Node 的子进程只需要执定要执行的 JavaScript 文件模块即可.
注意: 后面的 3 种方法都是 spawn()的延伸应用.
例:
使用 spawn 方式创建子进程:
- /*
- Use spawn.
- */
- for (let i = 0; i <3; i++) {
- /* child_process.spawn(command[, args][, options]) */
- /* args is an array of string */
- const childProcessorSpawn = child_process.spawn("node", ["child.js", i]);
- childProcessorSpawn.stdout.on("data", (data) => {
- console.log(`stdout: ${data}`);
- });
- childProcessorSpawn.stderr.on("data", (data) => {
- console.log(`stderr: ${data}`);
- });
- childProcessorSpawn.on("close", function(code) {
- /* Any exit code other than 0 is considered to be an error. */
- console.log("Child process closed, code:" + code);
- });
- }
使用 exec 方式创建子进程:
- const child_process = require("child_process");
- /*
- Use exec.
- */
- for (let i = 0; i <3; i++) {
- /* child_process.exec(command[, options], callback) */
- /* callback <Function> called with the output when process terminates. */
- const childProcessorExec = child_process.exec("node child.js" + i, function(error, stdout, stderr) {
- if (error) {
- console.error(`exec error: ${error}`);
- return;
- }
- /* ES6 template literal */
- console.log(`stdout: ${stdout}`);
- console.log(`stderr: ${stderr}`);
- // console.log("stdout:" + stdout);
- // console.log("stderr:" + stderr);
- });
- childProcessorExec.on("exit", function(code) {
- /* Any exit code other than 0 is considered to be an error. */
- console.log("Child process exited, code:" + code);
- });
- }
来源: http://www.css88.com/qa/node-js/10827.html