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