类: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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
