Skip to main content

Work threads

When to use the Worker Threads ?

  • Freeing up the main thread
  • Procesisng of CPU-intensive requests
  • Native JS multithreading

Commands

# 通过 call GET request 了解多线程的总计算时间
time curl --get [url]

占用大量 CPU 的任务

index.js
const express = require("express");

const app = express();
const port = process.env.PORT || 3000;

app.get("/non-blocking/", (req, res) => {
res.status(200).send("This page is non-blocking");
});

app.get("/bloging", (req, res) => {
let counter = 0;
for (let i = 0; i < 20_000_000_000; i++) {
counter++;
}
res.status(200).send(`result is ${counter}`);
});

app.listen(port, () => {
console.log(`App listening on port ${port}`);
});

使用单个新线程

worker.js
const { parentPort } = require("wroker_threads");

let counter = 0;
for (let i = 0; i < 20_000_000_000; i++) {
counter++;
}

parentPort.postMessage(counter);
index-with-worker.js
const express = require("express");
const { Worker } = require("worker_threads");

const app = express();
const port = process.env.PORT || 3000;

app.get("/non-blocking/", (req, res) => {
res.status(200).send("This page is non-blocking");
});

app.get("/bloging", (req, res) => {
const worker = new Worker("./worker.js");

worker.on("message", (data) => {
res.status(200).send(`result is ${data}`);
});

worker.on("error", (error) => {
res.status(404).send(`An error occured ${error}`);
});
});

app.listen(port, () => {
console.log(`App listening on port ${port}`);
});

使用 4 个新线程

four-workers.js
const { workerData, parentPort } = require("wroker_threads");

let counter = 0;
for (let i = 0; i < 20_000_000_000 / workerData.thread_count; i++) {
counter++;
}

parentPort.postMessage(counter);
index-with-four-workers.js
const express = require("express");
const { Worker } = require("worker_threads");

const app = express();
const port = process.env.PORT || 3000;
const THREAD_COUNT = 4;

app.get("/non-blocking/", (req, res) => {
res.status(200).send("This page is non-blocking");
});

function createWorker() {
return new Promise((resolve, reject) =. {
const worker = new Worker("./four-wokers.js", {
workerData: {thread_count: THREAD_COUNT}
});

worker.on("message", (data) => {
resolve(data);
});

worker.on("error", (error) => {
reject(`An error occured ${error}`);
});
})
}

app.get("/bloging", async (req, res) => {
const workerPromises = [];

for (let i = 0; i< THREAD_COUNT; i++) {
workerPromises.push(createWoker());
}

const thread_results = await Promise.all(workerPromises);
const total = thread_results[0] + thread_results[1] + thread_results[2] + thread_results[3];

res.status(200).send(`result is ${total}`);
});

app.listen(port, () => {
console.log(`App listening on port ${port}`);
});

Resources

How to use Multithreading with "worker threads" in Node.js?: https://www.youtube.com/watch?v=MuwJJrfIfsU&list=PL5Lsd0YA4OMGN86vWiW7O52izu-cTxcS3&index=1