How to Use All the Cores on Multi-Core Machines in node.js
Node.js is designed to be single-threaded, but you can take advantage of multi-core machines by utilizing the cluster
module or by creating separate Node.js processes manually.
Using the cluster
Module
The cluster
module allows you to create child processes (workers) that share the same port, enabling load balancing across CPU cores. Here's a basic example:
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
// Fork workers
for (let i = 0; i < os.cpus().length; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
// Your application logic here
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello from worker ' + cluster.worker.id);
});
app.listen(3000, () => {
console.log(`Worker ${cluster.worker.id} running`);
});
}
In this example, the master process forks child processes, each running a worker. Each worker is a separate instance of your application, and they can share the load.
Using Multiple Processes Manually
Another approach is to create multiple Node.js processes manually and distribute the workload. This can be done using a process manager like pm2
or by using tools like child_process
to spawn multiple Node.js processes. Here's a simplified example:
const { fork } = require('child_process');
const os = require('os');
// Fork processes
for (let i = 0; i < os.cpus().length; i++) {
const worker = fork('worker.js');
console.log(`Forked worker ${worker.pid}`);
}
// worker.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello from worker ' + process.pid);
});
app.listen(3000, () => {
console.log(`Worker ${process.pid} running`);
});
This example manually forks multiple Node.js processes, each running the same worker.js
application.
Choose the method that best fits your application and deployment environment. Note that effective load balancing may require additional considerations, and the choice between these methods depends on your specific use case.