Skip to content

Instantly share code, notes, and snippets.

@djinn
Created April 18, 2025 13:43
Show Gist options
  • Save djinn/63fe94d14cf58963af32ec1869a29833 to your computer and use it in GitHub Desktop.
Save djinn/63fe94d14cf58963af32ec1869a29833 to your computer and use it in GitHub Desktop.
NodeJS native multithreaded code
const {
Worker,
isMainThread,
parentPort,
workerData,
MessageChannel,
} = require("node:worker_threads");
const http = require("node:http");
if (isMainThread) {
const { port1: httpPort, port2: httpWorkerPort } = new MessageChannel();
const { port1: computePort, port2: computeWorkerPort } = new MessageChannel();
new Worker(__filename, {
workerData: { type: "http", port: httpWorkerPort },
transferList: [httpWorkerPort],
});
new Worker(__filename, {
workerData: { type: "compute", port: computeWorkerPort },
transferList: [computeWorkerPort],
});
httpPort.on("message", (msg) => console.log(`[HTTP] ${msg}`));
computePort.on("message", (msg) => console.log(`[COMPUTE] ${msg}`));
httpPort.postMessage("start");
computePort.postMessage(25); // Fibonacci(25)
} else {
const port = workerData.port;
if (workerData.type === "http") {
port.on("message", (msg) => {
if (msg === "start") {
http
.createServer((req, res) => {
res.writeHead(200);
res.end("Hello from HTTP worker\n");
port.postMessage(`Handled request: ${req.url}`);
})
.listen(3000, () => {
port.postMessage("Server started on port 3000");
});
}
});
}
if (workerData.type === "compute") {
function fib(n) {
return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}
port.on("message", (n) => {
const result = fib(n);
port.postMessage(`Fibonacci(${n}) = ${result}`);
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment