Creating and Using Dedicated Web Workers
Dedicated Web Workers are the simplest and most commonly used type of Web Workers. They are tied to the script that creates them and are ideal for offloading tasks that don’t need to be shared across different scripts or contexts.
1. Creating a Dedicated Worker
To create a Dedicated Worker, you first need to create a separate JavaScript file that will contain the code to be executed in the worker. Here’s an example of how to create and use a Dedicated Worker:
Step 1: Create a Worker Script
Let’s create a simple worker script called worker.js
:
// worker.js
// Listen for messages from the main thread
self.onmessage = function (e) {
console.log('Worker received:', e.data);
// Perform a simple calculation (e.g., squaring a number)
const result = e.data * e.data;
// Send the result back to the main thread
self.postMessage(result);
};
Step 2: Create the Main Script
Next, create the main script that will use the worker:
// main.js
// Create a new Worker instance
const myWorker = new Worker('worker.js');
// Send data to the Worker
myWorker.postMessage(10);
// Listen for messages from the Worker
myWorker.onmessage = function (e) {
console.log('Main thread received:', e.data);
};
// Terminate the Worker when it's no longer needed
// myWorker.terminate();
Explanation:
The
worker.js
file contains the code that runs in the worker thread. It listens for messages from the main thread usingself.onmessage
and sends a response back usingself.postMessage
.In the
main.js
file, we create a new worker instance using theWorker
constructor, passing the path to the worker script. We then usepostMessage
to send data to the worker and listen for responses withonmessage
.
2. Sending Messages to and from a Worker
The main thread and the worker communicate using messages. Messages can be sent back and forth using postMessage
and onmessage
, as shown in the example above.
Example: Passing Complex Data to the Worker
You can also pass more complex data structures to the worker:
// main.js
const complexData = {
numbers: [1, 2, 3, 4, 5],
operation: 'sum'
};
myWorker.postMessage(complexData);
In the worker script, you can handle this complex data:
// worker.js
self.onmessage = function (e) {
const data = e.data;
if (data.operation === 'sum') {
const result = data.numbers.reduce((a, b) => a + b, 0);
self.postMessage(result);
}
};
3. Terminating a Worker
Once a worker has completed its task, you may want to terminate it to free up resources. You can do this using the terminate
method:
myWorker.terminate();
This immediately stops the worker’s execution, and it can no longer be used after this point.
4. Example: A Simple Calculation in a Worker
Let’s combine everything we’ve learned into a complete example:
Worker Script (worker.js
):
self.onmessage = function (e) {
const number = e.data;
const result = number * number;
self.postMessage(result);
};
Main Script (main.js
):
const myWorker = new Worker('worker.js');
myWorker.postMessage(25);
myWorker.onmessage = function (e) {
console.log('Result from Worker:', e.data); // Should log 625
myWorker.terminate();
};
In this example, the main thread sends a number to the worker, the worker squares the number, and then sends the result back to the main thread. The worker is terminated after the task is complete.