Nodejs學習記錄: worker_threads(工做線程)

Node.js因爲JS的執行在單一線程,致使CPU密集計算的任務可能會使主線程會處於繁忙的狀態,進而影響服務的性能,雖然能夠經過child_process模塊建立子進程的方式來解決,可是一方面進程之間沒法共享內存,另外一方面建立進程的開銷也不小。因此在10.5.0版本中Node.js提供了worker_threads模塊來支持多線程,一直以來被人所詬病的不擅長CPU密集計算有望成爲歷史。

源碼 --> https://github.com/nodejs/nod...
worker_thread 模塊中有 4 個對象和 2 個類。node

  • isMainThread: 是不是主線程,源碼中是經過 threadId === 0 進行判斷的。
  • MessagePort: 用於線程之間的通訊,繼承自 EventEmitter。
  • MessageChannel: 用於建立異步、雙向通訊的通道實例。
  • threadId: 線程 ID。
  • Worker: 用於在主線程中建立子線程。第一個參數爲 filename,表示子線程執行的入口。
  • parentPort: 在 worker 線程裏是表示父進程的 MessagePort 類型的對象,在主線程裏爲 null
  • workerData: 用於在主進程中向子進程傳遞數據(data 副本)
const assert = require('assert');
const {
  Worker,
  MessageChannel,
  MessagePort,
  isMainThread,
  parentPort
} = require('worker_threads');
if (isMainThread) {
  const worker = new Worker(__filename);
  const subChannel = new MessageChannel();
  worker.postMessage({ hereIsYourPort: subChannel.port1 }, [subChannel.port1]);
  subChannel.port2.on('message', (value) => {
    console.log('received:', value);
  });
} else {
  parentPort.once('message', (value) => {
    assert(value.hereIsYourPort instanceof MessagePort);
    value.hereIsYourPort.postMessage('the worker is sending this');
    value.hereIsYourPort.close();
  });
}
相關文章
相關標籤/搜索