在 Node.js 中,多線程編程的主要方式是使用工作線程模塊(Worker Threads module),它可以在 Node.js 進(jìn)程中創(chuàng)建獨(dú)立的 JavaScript 執(zhí)行環(huán)境,每個(gè)執(zhí)行環(huán)境都有自己的 V8 實(shí)例、內(nèi)存堆棧和事件循環(huán)。
以下是使用worker線程模塊進(jìn)行多線程編程的基本步驟:
- 引入worker線程模塊:
const { Worker } = require('worker_threads');
- 創(chuàng)建worker線程:
const worker = new Worker('./worker.js');
- 監(jiān)聽(tīng)worker線程消息:
worker.on('message', (message) => {
console.log(`Received message from worker: ${message}`);
});
- 發(fā)送消息到worker線程:
worker.postMessage('Hello from the main thread!');
- 在worker線程中處理消息:
const { parentPort } = require('worker_threads');
parentPort.on('message', (message) => {
console.log(`Received message from main thread: ${message}`);
parentPort.postMessage('Hello from the worker thread!');
});
上述代碼中,worker.js 文件是一個(gè)獨(dú)立的 JavaScript 執(zhí)行環(huán)境,可以在其中編寫(xiě)?yīng)毩⒌木€程代碼,而主線程(即調(diào)用 new Worker() 的線程)可以通過(guò) worker.postMessage() 發(fā)送消息到工作線程,工作線程可以通過(guò) parentPort.on('message') 監(jiān)聽(tīng)消息,然后處理消息并通過(guò) parentPort.postMessage() 發(fā)送回復(fù)消息到主線程。
需要注意的是,在 Node.js 中,由于 V8 的限制,不能在多個(gè)線程之間共享內(nèi)存,因此如果需要在多個(gè)線程之間傳遞大量數(shù)據(jù),可以使用 Buffer 或 SharedArrayBuffer 等方式進(jìn)行數(shù)據(jù)傳輸。此外,需要注意控制線程數(shù)量,避免過(guò)度創(chuàng)建線程導(dǎo)致系統(tǒng)資源浪費(fèi)。