📜  Node.js-扩展应用程序

📅  最后修改于: 2020-11-03 10:12:46             🧑  作者: Mango


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

子进程始终具有三个流child.stdinchild.stdoutchild.stderr ,它们可以与父进程的stdio流共享。

Node提供child_process模块,该模块具有以下三种创建子进程的主要方法。

  • exec -child_process.exec方法在shell /控制台中运行命令并缓冲输出。

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

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

exec()方法

child_process.exec方法在外壳中运行命令并缓冲输出。它具有以下签名-

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

参量

这是使用的参数的描述-

  • command (字符串)要运行的命令,带有空格分隔的参数

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

    • cwd (字符串)子进程的当前工作目录

    • env (对象)环境键值对

    • 编码(String)(默认:’utf8’)

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

    • 超时(数字)(默认值:0)

    • maxBuffer (Number)(默认值:200 * 1024)

    • killSignal (String)(默认:’SIGTERM’)

    • uid (数字)设置进程的用户身份。

    • gid (数字)设置进程的组标识。

  • callback该函数获得三个参数errorstdoutstderr ,这些参数在进程终止时与输出一起调用。

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])

参量

这是使用的参数的描述-

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

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

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

    • cwd (字符串)子进程的当前工作目录。

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

    • stdio (数组)字符串子级的stdio配置。

    • customFds (Array)不推荐使用的子描述符,供子代用于stdio。

    • detached (布尔型)子级将是流程组负责人。

    • uid (数字)设置进程的用户身份。

    • gid (数字)设置进程的组标识。

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 (字符串)要在子代中运行的模块。

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

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

    • cwd (字符串)子进程的当前工作目录。

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

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

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

    • silent (布尔值)如果为true,则将子级的子级stdin,stdout和stderr通过管道传递给父级,否则它们将从父级继承,请参见spawn()的stdio的“ pipe”和“ heritit”选项更多详细信息(默认为false)。

    • uid (数字)设置进程的用户身份。

    • gid (数字)设置进程的组标识。

fork方法除了将所有方法都包含在常规ChildProcess实例中之外,还返回带有内置通信通道的对象。

创建两个名为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