Node.js - 扩展应用程序

Node.js以单线程模式运行,但它使用事件驱动的范例来处理并发.它还有助于创建子进程,以便在基于多核CPU的系统上利用并行处理.

子进程总是有三个流 child.stdin child.stdout child.stderr ,可以与父进程的stdio流共享.

节点提供 child_process 模块,它有以下三种主要方式来创建子进程.

  • exec :  child_process.exec方法在shell/console中运行命令并缓冲输出.

  • spawn :  child_process.spawn使用给定的命令启动一个新进程.

  • fork :  child_process.fork方法是spawn()创建子进程的特例.

exec()方法

child_process.exec方法在shell中运行命令并缓冲输出.它具有以下签名 :

 
 child_process.exec(command [,options],callback)

参数

以下是所用参数的说明及减号;

  • command (String)要使用空格分隔的参数运行的命令

  • 选项(对象)可以包含以下一个或多个选项 :

    • cwd (String)子进程的当前工作目录

    • env (对象)环境键值对

    • 编码(字符串)(默认值:'utf8')

    • shell (String)用于执行命令的Shell(UNIX上的默认:'/bin/sh',Windows上的'cmd.exe',shell应该理解UNIX上的-c开关或/s/c.在Windows上.在Windows上,命令行解析应该与cmd.exe兼容.)

    • 时间out (号码)(默认值:0)

    • maxBuffer (号码)(默认值:200 * 1024)

    • killSignal (字符串)(默认:'SIGTERM')

    • uid (Number)设置进程的用户标识.

    • gid (Number)设置流程的组标识.

  • 回调该函数获取三个参数错误 stdout, stderr 在进程终止时使用输出调用.

exec()方法返回一个具有最大大小的缓冲区并等待进程结束并尝试一次返回所有缓冲的数据.

示例

让我们创建两个名为support.js和master.js : 的js文件;

文件:support.js

console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js

const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,function 
      (error, stdout, stderr) {
      
      if (error) {
         console.log(error.stack);
         console.log('Error code: '+error.code);
         console.log('Signal received: '+error.signal);
      }
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
   });

   workerProcess.on('exit', function (code) {
      console.log('Child process exited with exit code '+code);
   });
}

现在运行master.js查看结果 :

 
 $ node master.js

验证输出.服务器已启动.

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

spawn()方法

child_process.spawn方法使用给定命令启动新进程.它具有以下签名 :

child_process.spawn(command[, args][, options])

参数

以下是所用参数的说明及减号;

  • 命令(字符串)要运行的命令

  • args (数组)字符串参数列表

  • 选项(对象)可能包含以下一个或多个选项 :

    • cwd (String)子进程的当前工作目录.

    • env (对象)环境键值对.

    • stdio (Array)String Child的stdio配置.

    • customFds (Array)不推荐使用stdio的子文件描述符.

    • 分离(布尔值)孩子将成为流程组负责人.

    • uid (Number)设置用户标识这个过程的过程.

    • gid (Number)设置过程的组标识.

spawn()方法返回流(stdout& stderr),应该在该过程返回一定量的数据.一旦进程开始执行,spawn()就开始接收响应.

示例

创建两个名为support.js和master.js的js文件 :

文件:support.js

console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i = 0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

现在运行master.js查看结果 :

 
 $ node master.js

验证输出.服务器已启动

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

fork()方法

child_process.fork方法是spawn()创建Node进程的特例.它具有以下签名 :

 
 child_process.fork(modulePath [,args] [,options])

参数

以下是所用参数的说明及减号;

  • modulePath (String)要在子项中运行的模块.

  • args (数组)字符串参数列表

  • 选项(对象)可以包含以下一个或多个选项 :

    • cwd (String)子进程的当前工作目录.

    • env (对象)环境键值对.

    • execPath (String)用于创建子进程的可执行文件.

    • execArgv (数组)字符串参数列表传递给可执行文件(默认值:process.execArgv).

    • silent (布尔值)如果为true,则stdin,stdout和stderr这孩子将是pip编辑到父级,否则它们将从父级继承,请参阅spawn()的stdio的"管道"和"继承"选项以获取更多详细信息(默认为false).

    • uid (Number)设置进程的用户标识.

    • gid (Number)设置流程的组标识.

除了在普通的ChildProcess中拥有所有方法之外,fork方法还返回一个具有内置通信通道的对象实例.

示例

创建两个名为support.js和master.js : 的js文件;

文件:support.js

console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process = child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

现在运行master.js查看结果 :

 
 $ node master.js

验证输出.服务器已启动.

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0