Nodejs多进程

简介: nodejs学习笔记

Node.js本身是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。

每个子进程总是带有三个流对象: stdin , stdoutstderr 。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。

Node提供了child_process模块来创建子进程,方法有:

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

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应当能识别-c开关在UNIX中,或/s /c在 Windows中。 在Windows中,命令行解析应当能兼容cmd.exe
  • callback :回调函数,包含三个参数 error , stdoutstderr

exec()方法返回最大的缓冲区,并等待进程结束,一次性返回缓冲区的内容。


创建一个 start2.js 文件,作为子进程来执行,其内容为:

console.log("start2...")

主进程:

constchild_process=require('child_process');
varworkerProcess=child_process.exec('node start2.js ',
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('子进程已退出');
});

执行结果:

image.png


spawn() 方法

child_process.spawn使用指定的命令行参数创建新进程,语法格式如下:

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()时就开始接收响应。


主进程内容:

constchild_process=require('child_process');
varworkerProcess=child_process.spawn('node', ['start2.js']);
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('子进程已退出');
});

执行结果:

image.png


fork 方法

child_process.fork是spawn()方法的特殊形式,用于创建进程,语法格式如下:

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,子进程的stdinstdoutstderr将会被关联至父进程,否则,它们将会从父进程中继承。(默认为:false
  • uid:Number,设置用户进程的ID
  • gid:Number,设置进程组的ID

返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道。


主进程内容:

constchild_process=require('child_process');
varworker_process=child_process.fork("start2.js")
worker_process.on('close', function (code) {
console.log('子进程已退出');
});

执行结果:

image.png

目录
相关文章
|
前端开发
bat 批处理文件 结束node进程 杀死指定端口
bat 批处理文件 结束node进程 杀死指定端口
|
6月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
158 1
|
1月前
|
缓存 JavaScript Unix
Node.js 多进程
10月更文挑战第8天
32 0
|
3月前
|
JavaScript Windows
NodeJs——如何获取Windows电脑指定应用进程信息
NodeJs——如何获取Windows电脑指定应用进程信息
114 0
|
3月前
|
JavaScript 前端开发
nodejs process进程
nodejs process进程
31 0
|
5月前
|
JavaScript 前端开发 Shell
深入Node.js的进程与子进程:从文档到实践
深入Node.js的进程与子进程:从文档到实践
|
5月前
|
缓存 JavaScript Unix
Node.js 多进程
Node.js 多进程
35 0
|
6月前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
node子进程(Child Process)获取硬盘分区
node子进程(Child Process)获取硬盘分区
61 0
|
JSON 资源调度 负载均衡
这可能是你见过最全的Node.js应用程序管理与部署:使用PM2进行进程管理
node是单线程应用,单线程最大的弊端就是无法利用多核CPU带来的优势来提升运行效率。 pm2(process manager)是一个进程管理工具,可以用它来管理node进程,负责所有的node进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。
501 0
这可能是你见过最全的Node.js应用程序管理与部署:使用PM2进行进程管理