Bird
Raised Fist0
Node.jsframework~20 mins

Creating worker threads in Node.js - Practice Exercises

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Worker Threads Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of a simple worker thread example
What will be printed to the console when this Node.js code runs?
Node.js
import { Worker, isMainThread, parentPort } from 'worker_threads';

if (isMainThread) {
  const worker = new Worker(new URL(import.meta.url));
  worker.on('message', (msg) => console.log(msg));
} else {
  parentPort.postMessage('Hello from worker');
}
Aundefined
BHello from worker
CError: Cannot find module
DNo output
Attempts:
2 left
💡 Hint
Remember that the worker sends a message back to the main thread.
component_behavior
intermediate
2:00remaining
Behavior of worker thread with data passed
What will be the output of this code snippet?
Node.js
import { Worker, isMainThread, parentPort, workerData } from 'worker_threads';

if (isMainThread) {
  const worker = new Worker(new URL(import.meta.url), { workerData: 5 });
  worker.on('message', (msg) => console.log(msg));
} else {
  parentPort.postMessage(workerData * 2);
}
A5
BNaN
C10
Dundefined
Attempts:
2 left
💡 Hint
Check how workerData is used inside the worker thread.
📝 Syntax
advanced
2:00remaining
Identify the syntax error in worker thread creation
Which option contains a syntax error that prevents the worker from starting?
Node.js
import { Worker, isMainThread } from 'worker_threads';

if (isMainThread) {
  const worker = new Worker('worker.js');
}
Aconst worker = new Worker(new URL('worker.js'));
Bconst worker = new Worker(new URL('worker.js', import.meta.url));
Cconst worker = new Worker(new URL(import.meta.url));
Dconst worker = new Worker('worker.js');
Attempts:
2 left
💡 Hint
Check how new URL() is used with relative paths in ES modules.
🔧 Debug
advanced
2:00remaining
Why does this worker thread code throw an error?
This code throws an error when run. What is the cause?
Node.js
import { Worker, isMainThread } from 'worker_threads';

if (isMainThread) {
  const worker = new Worker('./worker.js');
  worker.on('message', (msg) => console.log(msg));
} else {
  parentPort.postMessage('Hi');
}
ACannot use relative path string without URL in ES modules
BparentPort is undefined in main thread
CMissing import of parentPort in worker thread
DWorker file './worker.js' does not exist
Attempts:
2 left
💡 Hint
Consider how worker threads are created in ES modules with relative paths.
lifecycle
expert
3:00remaining
Order of events in worker thread lifecycle
What is the correct order of these events when a worker thread is created and communicates back?
A1,3,2,4
B2,1,3,4
C3,1,2,4
D1,2,3,4
Attempts:
2 left
💡 Hint
Think about what happens first: creation, running, messaging, then receiving.

Practice

(1/5)
1. What is the main purpose of using worker_threads in Node.js?
easy
A. To handle HTTP requests faster
B. To simplify asynchronous callbacks
C. To manage database connections
D. To run code in parallel without blocking the main thread

Solution

  1. Step 1: Understand worker threads role

    Worker threads allow running JavaScript code in parallel threads separate from the main thread.
  2. Step 2: Compare with other options

    Options B, C, and D describe unrelated tasks; worker threads specifically help avoid blocking the main thread.
  3. Final Answer:

    To run code in parallel without blocking the main thread -> Option D
  4. Quick Check:

    Parallel code execution = A [OK]
Hint: Worker threads run code parallel to main thread [OK]
Common Mistakes:
  • Confusing worker threads with async callbacks
  • Thinking worker threads manage HTTP or DB tasks directly
2. Which of the following is the correct way to import the Worker class from the worker_threads module?
easy
A. const Worker = require('worker_threads');
B. import Worker from 'worker_threads';
C. const { Worker } = require('worker_threads');
D. const Worker = require('worker_threads').worker;

Solution

  1. Step 1: Recall correct import syntax

    The Worker class is a named export, so we use destructuring: const { Worker } = require('worker_threads');
  2. Step 2: Check other options

    const Worker = require('worker_threads'); assigns the entire module object, not the Worker class. import Worker from 'worker_threads'; uses ES module syntax which requires extra config. const Worker = require('worker_threads').worker; uses wrong property name.
  3. Final Answer:

    const { Worker } = require('worker_threads'); -> Option C
  4. Quick Check:

    Destructure Worker from module = D [OK]
Hint: Use destructuring to import Worker from worker_threads [OK]
Common Mistakes:
  • Using wrong property name like 'worker' instead of 'Worker'
  • Mixing CommonJS and ES module syntax incorrectly
3. What will be the output of the following code snippet?
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  const worker = new Worker(__filename);
  worker.on('message', msg => console.log('From worker:', msg));
  worker.postMessage('Hello');
} else {
  parentPort.on('message', msg => {
    parentPort.postMessage(msg + ' World');
  });
}
medium
A. From worker: Hello World
B. From worker: Hello
C. SyntaxError
D. No output

Solution

  1. Step 1: Understand main and worker thread roles

    Main thread creates a worker running the same file. It sends 'Hello' to worker.
  2. Step 2: Trace message passing

    Worker receives 'Hello', appends ' World', and sends back 'Hello World'. Main thread logs this message.
  3. Final Answer:

    From worker: Hello World -> Option A
  4. Quick Check:

    Message sent + ' World' logged = B [OK]
Hint: Worker appends ' World' and sends back message [OK]
Common Mistakes:
  • Expecting original message without modification
  • Confusing main thread and worker thread roles
  • Missing event listeners for messages
4. Identify the error in this worker thread code snippet:
const { Worker } = require('worker_threads');

const worker = new Worker('worker.js');
worker.on('message', msg => console.log(msg));
worker.postMessage('Start');
medium
A. Worker file path should be absolute or URL
B. Missing event listener for 'error' event
C. Cannot create Worker with a string filename
D. Cannot call postMessage on Worker instance

Solution

  1. Step 1: Check Worker constructor argument

    The Worker constructor expects an absolute path or a URL, not just a relative string like 'worker.js'.
  2. Step 2: Validate other options

    Cannot create Worker with a string filename is incorrect because Worker can be created with a filename if path is correct. Missing event listener for 'error' event is good practice but not an error. Cannot call postMessage on Worker instance is wrong; postMessage is valid on Worker.
  3. Final Answer:

    Worker file path should be absolute or URL -> Option A
  4. Quick Check:

    Worker needs absolute path or URL = C [OK]
Hint: Use absolute path or URL for Worker file [OK]
Common Mistakes:
  • Using relative paths without resolving them
  • Ignoring error event listeners
  • Thinking postMessage is invalid on Worker
5. You want to create a worker thread that performs a CPU-heavy calculation and sends the result back. Which approach correctly creates the worker and handles the result asynchronously?
hard
A. Use new Worker() without arguments and call worker.send() to communicate
B. Use new Worker('./calc.js') with worker.on('message', callback) and send data via worker.postMessage()
C. Use require('worker_threads').run() to start the worker and get a promise
D. Create a child process with child_process.fork() and communicate with worker.postMessage()

Solution

  1. Step 1: Identify correct Worker creation and communication

    Creating a worker with new Worker('./calc.js') and using worker.on('message') plus worker.postMessage() is the standard pattern.
  2. Step 2: Eliminate incorrect options

    Use new Worker() without arguments and call worker.send() to communicate is invalid because Worker requires a filename or code. Use require('worker_threads').run() to start the worker and get a promise is incorrect; no run() method exists. Create a child process with child_process.fork() and communicate with worker.postMessage() uses child_process, not worker_threads, and postMessage is not valid on child processes.
  3. Final Answer:

    Use new Worker('./calc.js') with worker.on('message', callback) and send data via worker.postMessage() -> Option B
  4. Quick Check:

    Worker with filename + message events = A [OK]
Hint: Use new Worker(filename) and message events for communication [OK]
Common Mistakes:
  • Trying to create Worker without filename
  • Confusing child_process with worker_threads
  • Using non-existent Worker methods