”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 深入解析Worker Threads与子进程

深入解析Worker Threads与子进程

发布于2025-04-13
浏览:144

工作线程允许您在多个线程中运行JavaScript代码。它们非常适合通过共享ArhenArrayBuffer在线程之间共享内存,并用于卸载CPU结合的任务(例如数据处理或计算)。 [2

儿童进程使您能够产生单独的进程,从而独立于主node.js进程运行任务。它们适合需要隔离的任务或使用非JavaScript脚本或二进制文件时。

例子:

const {worker} = require('worker_threads'); 函数resizeImage(ImagePath){ 返回新的承诺((分辨率,拒绝)=> { const worker = new Worker('./ resizeworker.js',{workerData:imagepath}); worker.on(“消息”,解决); worker.on('错误',拒绝); }); } // 用法 resizeImage('image.jpg')。然后(()=> console.log('image justized!'));

2️⃣

解析大型JSON文件或转换CSV数据可能是资源密集的。工作线程可以在块中处理数据,以确保应用程序保持响应迅速。 例子:

const {worker} = require('worker_threads'); const worker =新工作('./ dataparser.js'); worker.postmessage({filepath:'largedata.json'}); worker.on('消息',(data)=> { console.log('解析数据:',数据); }); [2 工作线程非常适合重型计算,例如生成质数,矩阵乘法或仿真。
例子:


const {worker} = require('worker_threads'); 功能计算Primes(limit){ 返回新的承诺((分辨率,拒绝)=> { const worker = new Worker('./ primeworker.js',{workerdata:limit}); worker.on(“消息”,解决); worker.on('错误',拒绝); }); } // 用法 计算Primes(100000)。

const { Worker } = require('worker_threads');

function resizeImage(imagePath) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./resizeWorker.js', { workerData: imagePath });
    worker.on('message', resolve);
    worker.on('error', reject);
  });
}

// Usage
resizeImage('image.jpg').then(() => console.log('Image resized!'));
[2

当您的应用程序需要通过运行shell命令与系统交互时,子进程是首选。 例子:

2️⃣

如果您的工作流程涉及Python,Ruby或其他脚本语言,则可以使用子进程执行这些脚本并处理其输出。

例子:
const { Worker } = require('worker_threads');

const worker = new Worker('./dataParser.js');
worker.postMessage({ filePath: 'largeData.json' });
worker.on('message', (data) => {
  console.log('Parsed Data:', data);
});

); pythonprocess.stdout.on('data',(data)=> { console.log(`输出:$ {data}`); }); [2 在类似微服务的方法中,您可以使用子进程处理通过IPC(IPC Inter-Process Communication)与主过程通信的孤立的独立任务。

例子:

const {fork} = require('child_process'); const child = fork('./ childservice.js'); child.on('消息',(消息)=> { console.log(“来自儿童的消息:”,消息); }); //将任务发送到儿童过程 child.send({task:'processData',有效载荷:[1,2,3]});

在工作线程和子进程之间选择
const { Worker } = require('worker_threads');

function calculatePrimes(limit) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./primeWorker.js', { workerData: limit });
    worker.on('message', resolve);
    worker.on('error', reject);
  });
}

// Usage
calculatePrimes(100000).then(primes => console.log(primes));

特征

[2
通过共享arraybuffer支持

const { exec } = require('child_process');

exec('ls -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`Error: ${error.message}`);
    return;
  }
  console.log(`Output:\n${stdout}`);
});

[2 共享环境,较少孤立的

完全隔离


[2

JavaScript
const { spawn } = require('child_process');

const pythonProcess = spawn('python', ['script.py']);

pythonProcess.stdout.on('data', (data) => {
  console.log(`Output: ${data}`);
});
系统级任务或外部代码

[2


沟通
const { fork } = require('child_process');

const child = fork('./childService.js');

child.on('message', (message) => {
  console.log('Message from child:', message);
});

// Send a task to the child process
child.send({ task: 'processData', payload: [1, 2, 3] });

通过消息传递,更快 通过IPC,慢

[2 javascript/node.js仅 [2 完全包含,孤立的失败监视性能:始终收听错误和退出事件以处理失败。 结论
任何脚本或系统级语言 快点 慢点 [2
卸载密集任务:使用cpu结合的任务和子进程的工作线程进行i/o-heavy操作或外部脚本执行。 使用node.js的内置profiler之类的工具来识别瓶颈。 优雅地处理错误:
工作人员线程和子进程增强了node.js开发人员摆脱单线读取事件循环的局限性。通过利用这些工具,您可以轻松地构建高度可扩展和响应迅速的应用程序来处理CPU和I/O/O密集型任务。无论您是处理图像,执行外壳命令还是管理微服务,了解何时使用工作人员线程和子进程是优化node.js应用程序中的性能的关键。 [2
版本声明 本文转载于:https://dev.to/wallacefreitas/understanding-worker-threads-and-child-processes-52nj?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-04-14
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-14
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-04-14
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-04-14
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-04-14
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-14
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-04-14
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-04-14
  • 为什么`rand() % 14`在苹果MCG上返回有限值?
    为什么`rand() % 14`在苹果MCG上返回有限值?
    rand()%14 generator在最近的程序中返回有限的值,开发人员遇到了一个问题,其中rand()%14表达式始终产生的值只能产生6或13的值,尽管试图执行6或13。问题在于苹果MCG使用的随机数生成器的性质。所解释的,MCG的16807的乘数可以由7分开。这意味着在使用Modulo 1...
    编程 发布于2025-04-14
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-14
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-14
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-14
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-14
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-04-14
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-04-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3