類:Worker
添加於:v10.5.0
- 擴展: <EventEmitter>
 
Worker 類代表一個獨立的 JavaScript 執行線程。大多數 Node.js API 都在其中可用。
Worker 環境中的顯著差異是:
、process.stdin和process.stdout可以被父線程重定向。process.stderr屬性設置為require('node:worker_threads').isMainThreadfalse。消息端口可用。require('node:worker_threads').parentPort不停止整個程序,隻是單線程,process.exit()不可用。process.abort()- 設置組或用戶 ID 的 
和process.chdir()process方法不可用。 是父線程環境變量的副本,除非另有說明。對一個副本的更改在其他線程中不可見,並且對本機 add-ons 不可見(除非process.env作為worker.SHARE_ENVenv選項傳遞給構造函數)。Worker無法修改。process.title- 信號不通過 
傳遞。process.on('...') - 由於調用
,執行可能會在任何時候停止。worker.terminate() - 無法訪問來自父進程的 IPC 通道。
 - 不支持
模塊。trace_events - 本機 add-ons 隻能從多個線程加載,如果它們滿足 certain conditions 。
 
在其他 Worker 中創建 Worker 實例是可能的。
就像網絡工作者和node:cluster 模塊,可以通過inter-thread消息傳遞實現雙向通信。在內部,一個Worker有一對內置的MessagePorts 已經相互關聯,當Worker被建造。雖然MessagePort父端的對象不是直接暴露的,它的函數是通過暴露的worker.postMessage()和worker.on('message')上的事件Worker父線程的對象。
要創建自定義消息傳遞通道(鼓勵使用默認全局通道,因為它有助於分離關注點),用戶可以在任一線程上創建一個 MessageChannel 對象並將該 MessageChannel 上的一個 MessagePort 傳遞給其他線程通過預先存在的通道,例如全局通道。
有關如何傳遞消息以及可以通過線程屏障成功傳輸哪種 JavaScript 值的更多信息,請參閱 。port.postMessage() 
const assert = require('node:assert');
const {
  Worker, MessageChannel, MessagePort, isMainThread, parentPort
} = require('node: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();
  });
}
相關用法
- Node.js Worker.isMainThread用法及代碼示例
 - Node.js Worker.exitedAfterDisconnect用法及代碼示例
 - Node.js Worker.disconnect()用法及代碼示例
 - Node.js Worker.send(message[, sendHandle[, options]][, callback])用法及代碼示例
 - Node.js Worker.isDead()用法及代碼示例
 - Node.js Writable Stream pipe事件用法及代碼示例
 - Node.js WritableStream用法及代碼示例
 - Node.js Writable Stream finish事件用法及代碼示例
 - Node.js Writable Stream unpipe事件用法及代碼示例
 - Node.js ServerHttp2Stream http2stream.pushStream(headers[, options], callback)用法及代碼示例
 - Node.js http2.Http2ServerRequest request.url用法及代碼示例
 - Node.js request.socket用法及代碼示例
 - Node.js assert.notEqual(actual, expected[, message])用法及代碼示例
 - Node.js tlsSocket.authorized用法及代碼示例
 - Node.js zlib.deflateRaw()用法及代碼示例
 - Node.js http.IncomingMessage message.rawHeaders用法及代碼示例
 - Node.js Console用法及代碼示例
 - Node.js GM transparent()用法及代碼示例
 - Node.js URL.protocol用法及代碼示例
 - Node.js http.Agent.reuseSocket(socket, request)用法及代碼示例
 - Node.js fs.filehandle.datasync()用法及代碼示例
 - Node.js socket.bind()用法及代碼示例
 - Node.js v8.getHeapSpaceStatistics()用法及代碼示例
 - Node.js http2session.destroyed用法及代碼示例
 - Node.js http.ServerResponse response.statusCode用法及代碼示例
 
注:本文由純淨天空篩選整理自nodejs.org大神的英文原創作品 Worker。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
