What is tiny-worker?
The tiny-worker npm package is a lightweight implementation of Web Workers for Node.js. It allows you to run JavaScript code in parallel threads, which can help improve the performance of CPU-intensive operations by offloading them to separate worker threads.
What are tiny-worker's main functionalities?
Creating a Worker
This feature allows you to create a new worker thread. The worker can execute code independently of the main thread and communicate back using messages.
const Worker = require('tiny-worker');
const worker = new Worker(function() {
postMessage('Hello from the worker!');
});
worker.onmessage = function(event) {
console.log(event.data); // 'Hello from the worker!'
};
Sending Messages to Worker
This feature allows the main thread to send messages to the worker thread. The worker can then process the message and send a response back to the main thread.
const Worker = require('tiny-worker');
const worker = new Worker(function() {
onmessage = function(event) {
postMessage('Received: ' + event.data);
};
});
worker.onmessage = function(event) {
console.log(event.data); // 'Received: Hello'
};
worker.postMessage('Hello');
Handling Errors in Worker
This feature allows you to handle errors that occur within the worker thread. You can set an error handler to catch and process any errors that are thrown in the worker.
const Worker = require('tiny-worker');
const worker = new Worker(function() {
throw new Error('Something went wrong');
});
worker.onerror = function(error) {
console.error('Worker error:', error.message); // 'Worker error: Something went wrong'
};
Other packages similar to tiny-worker
threads
The threads package is another library for managing worker threads in Node.js. It provides a higher-level API compared to worker_threads and includes features like thread pools and TypeScript support. It is more feature-rich but also more complex than tiny-worker.
node-worker-threads-pool
The node-worker-threads-pool package is a library that builds on top of the worker_threads module to provide a pool of worker threads. This can be useful for managing multiple worker threads efficiently. It offers more advanced thread management capabilities compared to tiny-worker.
tiny-worker
Tiny WebWorker for Server
require()
is available for flexible inline Worker scripts. Optional parameters args
Array & options
Object; see child_process.fork()
documentation.
Example
Creating a Worker from a file
The worker script:
onmessage = function (ev) {
postMessage(ev.data);
};
The core script:
var Worker = require("tiny-worker");
var worker = new Worker("repeat.js");
worker.onmessage = function (ev) {
console.log(ev.data);
worker.terminate();
};
worker.postMessage("Hello World!");
Enable ES6 import/export within Worker file
The worker helper script (helper.js):
export const dataFormatter = (data) => {
return `${data} World!`;
};
The worker script (repeat.js):
import { dataFormatter } from "./helper";
onmessage = function (ev) {
const data = dataFormatter(ev.data);
postMessage(data);
};
The core script:
var Worker = require("tiny-worker");
var worker = new Worker("repeat.js", [], {esm: true});
worker.onmessage = function (ev) {
console.log(ev.data);
worker.terminate();
};
worker.postMessage("Hello");
Creating a Worker from a Function
var Worker = require("tiny-worker");
var worker = new Worker(function () {
self.onmessage = function (ev) {
postMessage(ev.data);
};
});
worker.onmessage = function (ev) {
console.log(ev.data);
worker.terminate();
};
worker.postMessage("Hello World!");
Debugging
To be able to debug a child process, it must have a differnt debug port than the parent.
Tiny worker does this by adding a random port within a range to the parents debug port.
The default Range is [1, 300]
, it can be changed with the setRange(min, max)
method.
To disable any automatic port redirection set options.noDebugRedirection = true
.
automatic redirection
var Worker = require("tiny-worker");
Worker.setRange(2, 20);
var worker = new Worker(function () {
postMessage(process.debugPort);
});
worker.onmessage = function (ev) {
console.log(ev.data);
worker.terminate();
}
manual redirection
var Worker = require("tiny-worker");
var worker = new Worker(function () {
postMessage(process.debugPort);
}, [], {noDebugRedirection: true, execArgv: ["--debug=1235"]});
worker.onmessage = function (ev) {
console.log(ev.data);
worker.terminate();
}
Properties
onmessage
Message handler, accepts an Event
onerror
Error handler, accepts an Event
API
addEventListener(event, fn)
Adds an event listener
postMessage()
Broadcasts a message to the Worker
terminate()
Terminates the Worker
static setRange(min, max)
Sets range for debug ports, only affects current process.
Returns true if successful.
FAQ
- I have an orphaned child process that lives on past the parent process' lifespan
- Most likely a
SIGTERM
or SIGINT
is not reaching the child process
- How do I insure all process are terminated?
- In your core script register a listener for
SIGTERM
or SIGINT
via process.on()
which terminates (all) worker process(es) and then gracefully shutdowns via process.exit(0);
- Why
SIGTERM
or SIGINT
?
- Unix/BSD will work with
SIGTERM
, but if you also need to support Windows use SIGINT
License
Copyright (c) 2019 Jason Mulligan
Licensed under the BSD-3 license