- Assertion testing
- Async hooks
- Buffer
- C++ addons
- C/C++ addons with Node-API
- C++ embedder API
- Child processes
- Cluster
- Command-line options
- Console
- Crypto
- Debugger
- Deprecated APIs
- Diagnostics Channel
- DNS
- Domain
- Errors
- Events
- File system
- Globals
- HTTP
- HTTP/2
- HTTPS
- Inspector
- Internationalization
- Modules: CommonJS modules
- Modules: ECMAScript modules
- Modules:
moduleAPI - Modules: Packages
- Net
- OS
- Path
- Performance hooks
- Policies
- Process
- Punycode
- Query strings
- Readline
- REPL
- Report
- Stream
- String decoder
- Timers
- TLS/SSL
- Trace events
- TTY
- UDP/datagram
- URL
- Utilities
- V8
- VM
- WASI
- Worker threads
- Zlib
Node.js v14.17.4 documentation
Table of contents
- Worker threads
worker.isMainThreadworker.markAsUntransferable(object)worker.moveMessagePortToContext(port, contextifiedSandbox)worker.parentPortworker.receiveMessageOnPort(port)worker.resourceLimitsworker.SHARE_ENVworker.threadIdworker.workerData- Class:
MessageChannel - Class:
MessagePort - Class:
Workernew Worker(filename[, options])- Event:
'error' - Event:
'exit' - Event:
'message' - Event:
'messageerror' - Event:
'online' worker.getHeapSnapshot()worker.performanceworker.postMessage(value[, transferList])worker.ref()worker.resourceLimitsworker.stderrworker.stdinworker.stdoutworker.terminate()worker.threadIdworker.unref()
- Notes
Worker threads#
Source Code: lib/worker_threads.js
The worker_threads module enables the use of threads that execute JavaScript
in parallel. To access it:
const worker = require('worker_threads');
Workers (threads) are useful for performing CPU-intensive JavaScript operations. They will not help much with I/O-intensive work. Node.js’s built-in asynchronous I/O operations are more efficient than Workers can be.
Unlike child_process or cluster, worker_threads can share memory. They do
so by transferring ArrayBuffer instances or sharing SharedArrayBuffer
instances.
const {
Worker, isMainThread, parentPort, workerData
} = require('worker_threads');
if (isMainThread) {
module.exports = function parseJSAsync(script) {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename, {
workerData: script
});
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
});
};
} else {
const { parse } = require('some-js-parsing-library');
const script = workerData;
parentPort.postMessage(parse(script));
}
The above example spawns a Worker thread for each parse() call. In actual
practice, use a pool of Workers instead for these kinds of tasks. Otherwise, the
overhead of creating Workers would likely exceed their benefit.
When implementing a worker pool, use the AsyncResource API to inform
diagnostic tools (e.g. in order to provide asynchronous stack traces) about the
correlation between tasks and their outcomes. See
"Using AsyncResource for a Worker thread pool"
in the async_hooks documentation for an example implementation.
Worker threads inherit non-process-specific options by default. Refer to
Worker constructor options to know how to customize worker thread options,
specifically argv and execArgv options.
worker.isMainThread#
Is true if this code is not running inside of a Worker thread.
const { Worker, isMainThread } = require('worker_threads');
if (isMainThread) {
// This re-loads the current file inside a Worker instance.
new Worker(__filename);
} else {
console.log('Inside Worker!');
console.log(isMainThread); // Prints 'false'.
}
worker.markAsUntransferable(object)#
Mark an object as not transferable. If object occurs in the transfer list of
a port.postMessage() call, it will be ignored.
In particular, this makes sense for objects that can be cloned, rather than
transferred, and which are used by other objects on the sending side.
For example, Node.js marks the ArrayBuffers it uses for its
Buffer pool with this.
This operation cannot be undone.
const { MessageChannel, markAsUntransferable } = require('worker_threads');
const pooledBuffer = new ArrayBuffer(8);
const typedArray1 = new Uint8Array(pooledBuffer);
const typedArray2 = new Float64Array(pooledBuffer);
markAsUntransferable(pooledBuffer);
const { port1 } = new MessageChannel();
port1.postMessage(typedArray1, [ typedArray1.buffer ]);
// The following line prints the contents of typedArray1 -- it still owns
// its memory and has been cloned, not transferred. Without
// `markAsUntransferable()`, this would print an empty Uint8Array.
// typedArray2 is intact as well.
console.log(typedArray1);
console.log(typedArray2);
There is no equivalent to this API in browsers.
worker.moveMessagePortToContext(port, contextifiedSandbox)#
-
port<MessagePort> The message port which will be transferred. -
contextifiedSandbox<Object> A contextified object as returned by thevm.createContext()method. -
Returns: <MessagePort>
Transfer a MessagePort to a different vm Context. The original port
object will be rendered unusable, and the returned MessagePort instance will
take its place.
The returned MessagePort will be an object in the target context, and will
inherit from its global Object class. Objects passed to the
port.onmessage() listener will also be created in the target context
and inherit from its global Object class.
However, the created MessagePort will no longer inherit from
EventTarget, and only port.onmessage() can be used to receive
events using it.
worker.parentPort#
If this thread was spawned as a Worker, this will be a MessagePort
allowing communication with the parent thread. Messages sent using
parentPort.postMessage() will be available in the parent thread
using worker.on('message'), and messages sent from the parent thread
using worker.postMessage() will be available in this thread using
parentPort.on('message').
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.once('message', (message) => {
console.log(message); // Prints 'Hello, world!'.
});
worker.postMessage('Hello, world!');
} else {
// When a message from the parent thread is received, send it back:
parentPort.once('message', (message) => {
parentPort.postMessage(message);
});
}
worker.receiveMessageOnPort(port)#
-
port<MessagePort> -
Returns: <Object> | <undefined>
Receive a single message from a given MessagePort. If no message is available,
undefined is returned, otherwise an object with a single message property
that contains the message payload, corresponding to the oldest message in the
MessagePort’s queue.
const { MessageChannel, receiveMessageOnPort } = require('worker_threads');
const { port1, port2 } = new MessageChannel();
port1.postMessage({ hello: 'world' });
console.log(receiveMessageOnPort(port2));
// Prints: { message: { hello: 'world' } }
console.log(receiveMessageOnPort(port2));
// Prints: undefined
When this function is used, no 'message' event will be emitted and the
onmessage listener will not be invoked.
worker.resourceLimits#
Provides the set of JS engine resource constraints inside this Worker thread.
If the resourceLimits option was passed to the Worker constructor,
this matches its values.
If this is used in the main thread, its value is an empty object.