Node.js
Modulo Cluster
Ricerca…
Sintassi
- const cluster = require ("cluster")
- cluster.fork ()
- cluster.isMaster
- cluster.isWorker
- cluster.schedulingPolicy
- cluster.setupMaster (impostazioni)
- cluster.settings
- cluster.worker // in worker
- cluster.workers // in master
Osservazioni
Si noti che cluster.fork()
genera un processo figlio che inizia a eseguire lo script corrente dall'inizio, in contrasto con la chiamata di sistema fork()
in C che clona il processo corrente e continua dall'istruzione dopo la chiamata di sistema in entrambi i genitori e processo figlio.
La documentazione di Node.js ha una guida più completa ai cluster qui
Ciao mondo
Questo è il tuo cluster.js
:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
require('./server.js')();
}
Questo è il tuo server.js
principale:
const http = require('http');
function startServer() {
const server = http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello Http');
});
server.listen(3000);
}
if(!module.parent) {
// Start server if file is run directly
startServer();
} else {
// Export server, if file is referenced via cluster
module.exports = startServer;
}
In questo esempio, ospitiamo un server Web di base, tuttavia, giriamo i worker (processi secondari) utilizzando il modulo cluster incorporato. Il numero di processi forker dipende dal numero di core CPU disponibili. Ciò consente a un'applicazione Node.js di sfruttare le CPU multi-core, poiché una singola istanza di Node.js viene eseguita in un singolo thread. L'applicazione condividerà ora la porta 8000 su tutti i processi. I carichi verranno automaticamente distribuiti tra i lavoratori utilizzando il metodo Round-Robin per impostazione predefinita.
Esempio di cluster
Una singola istanza di Node.js
viene eseguita in un singolo thread. Per sfruttare i sistemi multi-core, l'applicazione può essere avviata in un cluster di processi Node.js per gestire il carico.
Il modulo cluster
consente di creare facilmente processi figlio che condividono tutte le porte del server.
L'esempio seguente crea il processo child worker nel processo principale che gestisce il carico su più core.
Esempio
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length; //number of CPUS
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork(); //creating child process
}
//on exit of cluster
cluster.on('exit', (worker, code, signal) => {
if (signal) {
console.log(`worker was killed by signal: ${signal}`);
} else if (code !== 0) {
console.log(`worker exited with error code: ${code}`);
} else {
console.log('worker success!');
}
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(3000);
}