工作線程允許您在多個線程中運行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