工作线程允许您在多个线程中运行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
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快点 慢点 | [2 | 完全包含,孤立的失败
---|---|---|
卸载密集任务:使用cpu结合的任务和子进程的工作线程进行i/o-heavy操作或外部脚本执行。 | 监视性能:使用node.js的内置profiler之类的工具来识别瓶颈。 | 优雅地处理错误: | 始终收听错误和退出事件以处理失败。
工作人员线程和子进程增强了node.js开发人员摆脱单线读取事件循环的局限性。通过利用这些工具,您可以轻松地构建高度可扩展和响应迅速的应用程序来处理CPU和I/O/O密集型任务。无论您是处理图像,执行外壳命令还是管理微服务,了解何时使用工作人员线程和子进程是优化node.js应用程序中的性能的关键。 [2 |
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3