」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 深入解析Worker Threads與子進程

深入解析Worker Threads與子進程

發佈於2025-04-13
瀏覽:382

工作線程允許您在多個線程中運行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]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3