工作執行緒可讓您在多個執行緒中執行 JavaScript 程式碼。它們非常適合透過 SharedArrayBuffer 在線程之間共享記憶體以及卸載資料處理或計算等 CPU 密集型任務。
子程序
子進程可讓您產生單獨的進程,以獨立於主 Node.js 進程運行任務。它們適合需要隔離的任務或使用非 JavaScript 腳本或二進位檔案時。
工作執行緒的現實用例
1️⃣ 影像處理
當處理大規模影像轉換時,例如調整大小、裁剪或應用濾鏡,工作線程可以將這些任務卸載到單獨的線程,以防止主事件循環阻塞。
範例:
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️⃣ 資料解析與轉換
解析大型 JSON 檔案或轉換 CSV 資料可能會佔用大量資源。工作執行緒可以分塊處理數據,確保應用程式保持回應。
範例:
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); });
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));
子程序的現實用例
1️⃣ 執行 Shell 指令
當您的應用程式需要透過執行 shell 命令與系統互動時,子進程是首選。
範例:
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️⃣ 執行非 JavaScript 腳本
如果您的工作流程涉及 Python、Ruby 或其他腳本語言,您可以使用子進程來執行這些腳本並處理其輸出。
範例:
const { spawn } = require('child_process'); const pythonProcess = spawn('python', ['script.py']); pythonProcess.stdout.on('data', (data) => { console.log(`Output: ${data}`); });
3️⃣ 微服務架構
在類似微服務的方法中,您可以使用子進程來處理隔離的、獨立的任務,這些任務透過 IPC(進程間通訊)與主進程進行通訊。
範例:
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] });
在工作執行緒與子程序之間進行選擇
Feature | Worker Threads | Child Processes |
---|---|---|
Memory Sharing | Supported via SharedArrayBuffer | Not supported |
Task Isolation | Shared environment, less isolated | Fully isolated |
Use Case | CPU-intensive tasks in JavaScript | System-level tasks or external code |
Overhead | Lower (same process) | Higher (separate processes) |
Communication | Via message passing, faster | Via IPC, slower |
Supported Languages | JavaScript/Node.js only | Any scripting or system-level language |
Startup Time | Faster | Slower |
Error Containment | Less contained, can crash the process | Fully contained, isolated failures |
使用工作執行緒和子程序的最佳實務
✓ 卸載密集型任務: 使用工作執行緒執行 CPU 密集型任務,使用子程序執行 I/O 密集型操作或外部腳本執行。
✓ 監控效能: 使用 Node.js 的內建分析器等工具來辨識瓶頸。
✓ 優雅地處理錯誤:始終監聽錯誤並退出事件以處理失敗。
✓ 有效擴充: 使用工作池或進程群集跨多個執行緒或進程分配任務。
結論
工作執行緒和子程序使 Node.js 開發人員能夠擺脫單執行緒事件循環的限制。透過利用這些工具,您可以建立高度可擴展且響應迅速的應用程序,輕鬆處理 CPU 和 I/O 密集型任務。無論您是處理映像、執行 shell 命令還是管理微服務,了解何時使用工作執行緒和子進程是優化 Node.js 應用程式效能的關鍵。
以上是了解工作線程和子進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!