Desarrollador Senior en MediaSmart Mobile
Consultor de Escalabilidad
Estrategias: Up & Out
Multiproceso
Módulo cluster
Demo
Fuente: EE Times
Así que, ¿qué piensas hacer con todos esos cores?
Java, Erlang, Objective-C: Multi-threading
C, C++, Go: Explicit multi-process
Python, Ruby: global lock
Node.js: single core
Divide y vencerás
Divide las tareas entre procesos
Agrega los resultados finales
Reinicia los procesos que no terminen
Repartiendo la carga
API "experimental" para controlar el multiproceso
Un master, varios workers
Los sockets se comparten
var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); }); } else { http.createServer(function(req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(8000); }Fuente: cluster
Envío:
process.send(message);
Recepción:
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].on('message', messageHandler);
});
De los workers a master
También disponible al revés
Calcular los hashes SHA-256 hasta el número dado
Contar el número de letras A en el hexadecimal
Sumar el total de letras en todos los hashes
Comparar con el valor teórico
Repo count-hashes
$ time node count-as.js 1000000
Dividir con cluster
$ time node multicount-as.js 1000000