Worker Thread

Background

  • Doing CPU intensive work like calculating the Fibonacci of a number or checking if a number is prime or not or heavy machine learning stuff is gonna make the application struggle because node only uses a single core of your CPU no matter how many cores you have.

  • As the request is handled with single thread on nodeJs, if the event loop is blocked by high workload, the upcoming request will also be blocked

const express = require("express")
const app = express()

app.get("/isprime", async (req, res) => {
  const startTime = new Date()
  const result = doingCPUHighWorkload();
  const endTime = new Date()
  res.json({
    number: parseInt(req.query.number),
    isprime: result,
    time: endTime.getTime() - startTime.getTime() + "ms",
  })
})

app.get("/testrequest", (req, res) => {
  res.send("I am unblocked now")
})

const doingCPUHighWorkload = (number) => {
  for(const i of largeArrSize){
    calculation(i)
  }
}

app.listen(3000, () => console.log("listening on port 3000"))
  • In prevent from the blocking of event loop, we should separate the workload into another thread, called worker thread

Introduction

  • When NodeJS process is launch, it gets launched with One process, One thread, One event loop, One V8 Engine Instance,

  • A V8 isolate refers to a separate entity within the chrome V8 runtime. It possesses its own JS heap and a microtask queue. This unique setup enables every Node.js worker to execute its JavaScript code in complete isolation from other workers.this isolation comes at a cost — the workers are unable to directly access each other’s heaps.

  • An event-based messaging system is provided so values can be exchanged between the processes.

Worker Event

Worker offers few events which we can tie up with the callbacks we want

  • message : The 'message' event is emitted when the worker thread has invoked parentPort.postMessage()arrow-up-right.

  • exit : The 'exit' event is emitted once the worker has stopped. If the worker exited by calling process.exit()arrow-up-right, the exitCode parameter is the passed exit code. If the worker was terminated, the exitCode parameter is 1. This is the final event emitted by any Worker instance.

  • error : The 'error' event is emitted if the worker thread throws an uncaught exception. In that case, the worker is terminated.

  • online: The 'online' event is emitted when the worker thread has started executing JavaScript code.

Example

Reference

Last updated