第21节 Node.js 多进程

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使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。

语法如下所示:

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文件代码:

console.log("进程 " + process.argv[2] + " 执行。" );

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('子进程已退出,退出码 '+code);});
}

执行以上代码,输出结果为:

$ node master.js 
子进程已退出,退出码 0
stdout: 进程 1 执行。stderr: 
子进程已退出,退出码 0
stdout: 进程 0 执行。stderr: 
子进程已退出,退出码 0
stdout: 进程 2 执行。stderr: 

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

实例

在这个实例中我们创建两个js文件support.js和master.js。

support.js文件代码:

console.log("进程 " + process.argv[2] + " 执行。" );

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('子进程已退出,退出码 '+code);});
}

执行以上代码,输出结果为:

$ node master.js stdout: 进程 0 执行。子进程已退出,退出码 0
stdout: 进程 1 执行。子进程已退出,退出码 0
stdout: 进程 2 执行。子进程已退出,退出码 0

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实例的所有方法,还有一个内建的通信信道。

实例

让我们创建两个js文件support.js和master.js。

support.js文件代码如下所示:

console.log("进程 " + process.argv[2] + " 执行。" );

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('子进程已退出,退出码 ' + code);});
}

执行以上代码,输出结果为:

$ node master.js 
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【走进Golang】测试SDK环境搭建成功,配置path环境变量

[1]进入控制命令台&#xff1a;win R -->cmd [2]证明SDK环境成功 1.此电脑 2.高级系统设置 3.环境变量 4.点击环境变量&#xff0c;进入找到 path&#xff0c;点击编辑 5.进入编辑,找到对应目录&#xff0c;配置成功 添加完成后&#xff0c;点击确定&#xff0c;确定&#…

LlamaIndex 工作流 并发执行

除了循环和分支之外&#xff0c;工作流还可以并发地执行步骤。当你有多个可以相互独立运行的步骤&#xff0c;并且这些步骤中包含需要等待的耗时操作时&#xff0c;这种并发执行的方式就非常有用&#xff0c;因为它允许其他步骤并行运行。 触发多个事件 到目前为止&#xff0…

精粹汇总:大厂编程规范(持续更新)

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 1 引言2 并发控制 (Concurrency Control)3 事务控…

curl 检查重定向的命令总结

查看是否发生了重定向&#xff1a; curl -I http://yourdomain.com跟踪整个重定向链&#xff1a; curl -IL http://yourdomain.com禁止跳转&#xff0c;检查是否返回 301/302&#xff1a; curl -I --max-redirs 0 http://yourdomain.com如果你只想看跳没跳 HTTPS&#xff0c…

STM32 Bootloader:使用文件头加载并启动应用程序

文章目录 STM32 Bootloader&#xff1a;使用文件头加载并启动应用程序的完整解析一、系统整体流程二、镜像头结构 image\_header\_t三、Bootloader 主函数流程1. 初始化 UART2. 调用启动函数3. 拷贝 APP 并跳转启动 四、跳转执行 APP 的实现五、总结与扩展思路 明白了&#xff…

无外接物理显示器的Ubuntu系统的远程桌面连接(升级版)

文章目录 操作步骤实践截图配置 Xorg 的虚拟显示界面(升级版) 操作步骤 “远程连接”,在设置里直接打开就可以.进行配置就行. 1.配置 GRUB 以支持无显示器启动 sudo nano /etc/default/grub (里面有一行改为: GRUB_CMDLINE_LINUX_DEFAULT"quiet splash videovesa:off vi…

ACCU-100安科瑞协调控制器:精准调控光伏逆变器

产品概述 ACCU-100微电网协调控制器是一款应用于微电网、分布式发电、储能等领域的智能协调控制器。它能接入光伏系统、风力发电、储能系统以及充电桩等设备&#xff0c;通过对微电网系统进行数据采集与分析&#xff0c;实时监控各类设备的运行状态和健康状况。在此基础上&…

长春光博会 | 麒麟信安:构建工业数字化安全基座,赋能智能制造转型升级

6月10日-13日&#xff0c;2025长春国际光电博览会Light国际会议&#xff08;简称长春光博会&#xff09;在长春东北亚国际博览中心盛大举行&#xff0c;吉林省委书记黄强出席并宣布开幕&#xff0c;省委副书记、省长胡玉亭致辞。本届大会聚焦光电信息领域的前沿技术和最新产品&…

书写时垂直笔画比水平笔画表现更好的心理机制分析

你有写字的时候总是垂直方向笔画好写&#xff0c;水平方向的笔画不好写的情况存在吗&#xff1f; 书写时垂直笔画比水平笔画表现更好的心理机制分析 从人类认知和行为模式的角度来理解这种现象。以下是深度心理分析&#xff1a; 核心心理动因 重力知觉内化&#xff1a; 垂直…

SpringAI使用总结

SpringAI使用总结 基本使用ChatModel和ChatClient简单对话流式输出预设角色prompt&#xff08;提示词&#xff09;function call&#xff08;工具调用&#xff09;参考 基本使用 ChatModel和ChatClient SpringAi支持非常多的模型&#xff0c;为了统一处理&#xff0c;SpringA…

历史交易数据涨跌分级

历史交易数据涨跌分级 # encoding:utf-8 import sys,traceback from loguru import loggersys.path.append("..") from QhSpiderTool import QhDorpFiled from QhCsvMode import *def QhZhangDieFenJi(QhDfData,QhFangFa"A"):"""历史交易数…

Kafka入门4.0.0版本(基于Java、SpringBoot操作)

Kafka入门4.0.0版本&#xff08;基于Java、SpringBoot操作&#xff09; 一、kafka概述 Kafka最初是由LinkedIn公司开发的&#xff0c;是一个高可靠、高吞吐量、低延迟的分布式发布订阅消息系统&#xff0c;它使用Scala语言编写&#xff0c;并于2010年被贡献给了Apache基金会&…

react react-router-dom中获取自定义参数v6.4版本之后

路由配置, AutnToken 组件作为权限、登录管理 import { createBrowserRouter, Navigate } from react-router-dom; import Layout from /layout/index; import Login from /pages/login; import Page404 from /pages/404;import AutnToken from /components/authToken; import…

AI中的Prompt

1. System 作用&#xff1a;设定 AI 的“角色设定”和“行为准则”。 内容&#xff1a;通常是描述 LLM 的身份、语气、行为范围、约束规则。 类似&#xff1a;在大语言模型中是最优先被考虑的提示。 示例&#xff1a; 你是一个专业的商品评价分析助手&#xff0c;请根据用户…

从人工到智能:IACheck如何重构检测报告审核工作流?

从人工到智能&#xff1a;IACheck如何重构检测报告审核工作流&#xff1f; 在当今AI技术迅猛发展的时代&#xff0c;各行各业正经历从“人工驱动”到“智能驱动”的根本性变革。检测认证&#xff08;TIC&#xff09;行业作为关乎质量与安全的重要支柱&#xff0c;也不例外。在…

React事件处理:如何给按钮绑定onClick点击事件?

系列回顾&#xff1a; 在前几篇文章中&#xff0c;我们已经学会了如何使用 State 管理组件的内部数据&#xff0c;以及如何通过 Props 实现父子组件之间的通信。我们的组件现在已经有了“数据”和“外观”。但是&#xff0c;它还像一个只能看的“模型”&#xff0c;无法与用户进…

【机器学习|学习笔记】粒子群优化(Particle Swarm Optimization, PSO)详解,附代码。

【机器学习|学习笔记】粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;详解&#xff0c;附代码。 【机器学习|学习笔记】粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;详解&#xff0c;附代码。 文章目录 【机器学习|学习笔记】粒…

深度剖析:AI 社媒矩阵营销工具,如何高效获客?

在社交媒体营销领域&#xff0c;竞争日益激烈&#xff0c;传统的社媒矩阵运营方式面临诸多挑战。而 AI 社媒矩阵营销工具的出现&#xff0c;正以前所未有的方式重构社媒矩阵的底层架构&#xff0c;为营销人员带来了全新的机遇与变革。接下来&#xff0c;我们将从技术破局、实战…

Spring XML 常用命名空间配置

Spring XML 常用命名空间配置 下面是一个综合性的Spring XML配置样例&#xff0c;展示了各种常用命名空间的使用方式&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&quo…

UE5场景漫游——开始界面及关卡跳转

UE中实现UMG游戏界面搭建及蓝图控制&#xff0c;点击游戏界面中的按钮实现关卡的跳转效果。 一、游戏界面显示。1.创建UMG&#xff0c;2.搭建UI。3.关卡蓝图控制显示 二、点击按钮之后实现关卡跳转