Node.js 多进程
-
扩展应用程序
Node.js以单线程模式运行,但是它使用事件驱动的范例来处理并发。它还有助于创建子进程,以在基于多核CPU的系统上利用并行处理。子进程始终具有三个流child.stdin,child.stdout和child.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 -(字符串)要运行的命令,带有以空格分隔的参数
-
options -(对象)可以包含以下一个或多个选项-
- cwd - (字符串)子进程的当前工作目录
- env - (对象)环境键值对
- encoding - (字符串)(默认:'utf8')
- shell - (字符串)用于执行命令的Shell(在UNIX上默认:'/bin/ sh',在Windows上使用'cmd.exe'。Shell应该理解UNIX上的-c开关或Windows上的/s/c。 ,命令行解析应与cmd.exe兼容。)
- timeout - 超时(数字)(默认值:0)
- maxBuffer - 最大缓冲(Number)(默认值:200 * 1024)
- killSignal - (String)(默认:'SIGTERM')
- uid - (数字)设置进程的用户身份。
- gid - (数字)设置进程的组标识。
- callback - 该函数获得三个参数error,stdout和stderr,这些参数在进程终止时与输出一起调用。
exec() - 方法返回一个最大大小的缓冲区,等待进程结束,并尝试一次返回所有缓冲的数据。例子让我们创建两个名为support.js和master.js的js文件-support.jsconsole.log("Child Process " + process.argv[2] + " executed." );
master.jsconst 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 -(数组)字符串参数列表
-
options - (对象)可以包含以下一个或多个选项-
- cwd - (字符串)子进程的当前工作目录。
- env - (对象)环境键值对。
- stdio - (数组)字符串子级的stdio配置。
- customFds - (Array)供子代用于stdio的不推荐使用的文件描述符。
- detached -(布尔型)子级将是流程组负责人。
- uid -(数字)设置进程的用户身份。
- gid -(数字)设置进程的组标识。
spawn()方法返回流(stdout&stderr),当进程返回大量数据时应使用它。一旦进程开始执行,spawn()就开始接收响应。例子让我们创建两个名为support.js和master.js的js文件-support.jsconsole.log("Child Process " + process.argv[2] + " executed." );
master.jsconst 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 -(数组)字符串参数列表
-
options - (对象)可以包含以下一个或多个选项-
- cwd - (字符串)子进程的当前工作目录。
- env - (对象)环境键值对。
- execPath - (字符串)可执行文件,用于创建子进程。
- execArgv - (Array)传递给可执行文件的字符串参数列表(默认值:process.execArgv)。
- silent - (布尔值)如果为true,则将子级的子级的stdin,stdout和stderr通过管道传递给父级,否则它们将从父级继承,请参见spawn()的stdio的“ pipe”和“ inherit”选项更多详细信息(默认为false)。
- uid - (数字)设置进程的用户身份。
- gid - (数字)设置进程的组标识。
fork方法除了将所有方法都包含在常规ChildProcess实例中之外,还返回带有内置通信通道的对象。例子让我们创建两个名为support.js和master.js的js文件-support.jsconsole.log("Child Process " + process.argv[2] + " executed." );
master.jsconst 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 exited with code 0 Child Process 2 executed. child process exited with code 0 child process exited with code 0