第21节 Node.js 多进程

[复制链接]
发表于 2025-6-10 18:34:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Node.js自己是以单线程的模式运行的,但它利用的是事件驱动来处理并发,如许有助于我们在多核 cpu 的系统上创建多个子进程,从而进步性能。
每个子进程总是带有三个流对象:child.stdin, child.stdout和child.stderr。他们可能会共享父进程的stdio流,或者也可以是独立的被导流的流对象。
Node提供了child_process模块来创建子进程,方法有:


  • exec - child_process.exec利用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
  • spawn - child_process.spawn利用指定的命令行参数创建新进程。
  • fork - child_process.fork是spawn()的特殊形式,用于在子进程中运行的模块,如fork('./son.js')相当于spawn('node', ['./son.js']) 。与spawn方法不同的是,fork会在父进程与子进程之间,创建一个通信管道,用于进程之间的通信。

exec() 方法

child_process.exec利用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
语法如下所示:
  1. child_process.exec(command[, options], callback)
复制代码
参数

参数说明如下:
command: 字符串, 将要运行的命令,参数利用空格隔开
options :对象,可以是:


  • cwd,字符串,子进程的当前工作目录
  • env,对象,环境变量键值对
  • encoding,字符串,字符编码(默认: 'utf8')
  • shell,字符串,将要执行命令的Shell(默认: 在UNIX中为/bin/sh, 在Windows中为cmd.exe, Shell应当能辨认-c开关在UNIX中,或/s /c在 Windows中。 在Windows中,命令行解析应当能兼容cmd.exe)
  • timeout,数字,超时时间(默认: 0)
  • maxBuffer,数字, 在stdout或stderr中允许存在的最大缓冲(二进制),如果超出那么子进程将会被杀死(默认: 200*1024)
  • killSignal,字符串,结束信号(默认:'SIGTERM')
  • uid,数字,设置用户进程的ID
  • gid,数字,设置进程组的ID
callback :回调函数,包含三个参数error, stdout和stderr。
exec()方法返回最大的缓冲区,并等待进程结束,一次性返回缓冲区的内容。
实例

让我们创建两个js文件support.js和master.js。
support.js文件代码:
  1. console.log("进程 " + process.argv[2] + " 执行。" );
复制代码
master.js文件代码:
  1. const fs = require('fs');
  2. const child_process = require('child_process');
  3. for(var i=0; i<3; i++) {
  4.    var workerProcess = child_process.exec('node support.js '+i,
  5.       function (error, stdout, stderr) {
  6.          if (error) {
  7.             console.log(error.stack);
  8.             console.log('Error code: '+error.code);
  9.             console.log('Signal received: '+error.signal);
  10.          }
  11.          console.log('stdout: ' + stdout);
  12.          console.log('stderr: ' + stderr);
  13.       });
  14.       workerProcess.on('exit', function (code) {
  15.       console.log('子进程已退出,退出码 '+code);
  16.    });
  17. }
复制代码
执行以上代码,输出结果为:
  1. $ node master.js
  2. 子进程已退出,退出码 0
  3. stdout: 进程 1 执行。
  4. stderr:
  5. 子进程已退出,退出码 0
  6. stdout: 进程 0 执行。
  7. stderr:
  8. 子进程已退出,退出码 0
  9. stdout: 进程 2 执行。
  10. stderr:
复制代码

spawn() 方法

child_process.spawn利用指定的命令行参数创建新进程,语法格式如下:
  1. child_process.spawn(command[, args][, options])
复制代码
参数

参数说明如下:
command: 将要运行的命令
args: Array字符串参数数组
options Object


  • cwd:String,子进程的当前工作目录
  • env:Object,环境变量键值对
  • stdio:Array|String,子进程的stdio配置
  • detached:Boolean,这个子进程将会酿成进程组的向导
  • uid:Number,设置用户进程的ID
  • gid:Number,设置进程组的ID
spawn()方法返回流 (stdout & stderr),在进程返回大量数据时利用。进程开始执行spawn()时就开始吸收响应。
实例

在这个实例中我们创建两个js文件support.js和master.js。
support.js文件代码:
  1. console.log("进程 " + process.argv[2] + " 执行。" );
复制代码
master.js文件代码:
  1. const fs = require('fs');
  2. const child_process = require('child_process');
  3. for(var i=0; i<3; i++) {
  4.    var workerProcess = child_process.spawn('node', ['support.js', i]);
  5.    workerProcess.stdout.on('data', function (data) {
  6.       console.log('stdout: ' + data);
  7.    });
  8.    workerProcess.stderr.on('data', function (data) {
  9.       console.log('stderr: ' + data);
  10.    });
  11.    workerProcess.on('close', function (code) {
  12.       console.log('子进程已退出,退出码 '+code);
  13.    });
  14. }
复制代码
执行以上代码,输出结果为:
  1. $ node master.js stdout: 进程 0 执行。
  2. 子进程已退出,退出码 0
  3. stdout: 进程 1 执行。
  4. 子进程已退出,退出码 0
  5. stdout: 进程 2 执行。
  6. 子进程已退出,退出码 0
复制代码

fork 方法

child_process.fork是spawn()方法的特殊形式,用于创建进程,语法格式如下:
  1. child_process.fork(modulePath[, args][, options])
复制代码
参数

参数说明如下:
modulePath: String,将要在子进程中运行的模块
args: Array,字符串参数数组
options:Object


  • cwd:String,子进程的当前工作目录
  • env:Object,环境变量键值对
  • execPath:String,创建子进程的可执行文件
  • execArgv:Array,子进程的可执行文件的字符串参数数组(默认: process.execArgv)
  • silent:Boolean,如果为true,子进程的stdin,stdout和stderr将会被关联至父进程,否则,它们将会从父进程中继承。(默以为:false)
  • uid:Number,设置用户进程的ID
  • gid:Number,设置进程组的ID
返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道。
实例

让我们创建两个js文件support.js和master.js。
support.js文件代码如下所示:
  1. console.log("进程 " + process.argv[2] + " 执行。" );
复制代码
master.js文件代码如下所示:
  1. const fs = require('fs');
  2. const child_process = require('child_process');
  3. for(var i=0; i<3; i++) {
  4.    var worker_process = child_process.fork("support.js", [i]);       
  5.    worker_process.on('close', function (code) {
  6.       console.log('子进程已退出,退出码 ' + code);
  7.    });
  8. }
复制代码
执行以上代码,输出结果为:
  1. $ node master.js
  2. 进程 0 执行。
  3. 子进程已退出,退出码 0
  4. 进程 1 执行。
  5. 子进程已退出,退出码 0
  6. 进程 2 执行。
  7. 子进程已退出,退出码 0
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表