Heim > Web-Frontend > js-Tutorial > Verwenden Sie Cluster, um Ihren Knotenserver zu einem Multithread-Server_node.js zu erweitern

Verwenden Sie Cluster, um Ihren Knotenserver zu einem Multithread-Server_node.js zu erweitern

WBOY
Freigeben: 2016-05-16 16:31:48
Original
1347 Leute haben es durchsucht

Freunde, die NodeJS verwenden, wissen alle, dass Node Single-Threaded ist, was bedeutet, dass er auf einer 8-Kern-CPU läuft und nur die Rechenleistung eines Kerns nutzen kann.
Single-Threading war schon immer ein Kritikpunkt an Node, aber mit der Einführung von Cluster in Version 0.6 hat sich diese Situation geändert. Entwickler können sich darauf verlassen, dass Cluster ihren Node-Server problemlos zu einem Multithread-Server erweitern können.

Was ist Cluster?

Cluster ist eine von Node bereitgestellte Multithreading-Bibliothek, mit der Benutzer mehrere Threads erstellen können. Wenn eine externe Anfrage für diesen Port vorliegt, leitet der Cluster die Anfrage an einen zufälligen Thread weiter . Da jeder Knoten-Thread Dutzende Megabyte Speicher beansprucht, können Sie nicht wie PHP für jede Anfrage einen Thread erstellen. Im Allgemeinen wird die Anzahl der erstellten Threads höchstens die Anzahl der Kerne der CPU überschreiten.

Code kopieren Der Code lautet wie folgt:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
// Gabelarbeiter.
for (var i = 0; i < numCPUs; i ) {
​ cluster.fork();
}

cluster.on('exit', function(worker, code, signal) {
console.log('worker ' worker.process.pid ' died');
});
} sonst {
// Worker können jede TCP-Verbindung teilen
// In diesem Fall handelt es sich um einen HTTP-Server
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello worldn");
}).listen(8000);
}

Wie im obigen Code gezeigt, wird Cluster.isMaster auf true gesetzt, wenn das Programm ausgeführt wird. Nach dem Aufruf von Cluster.fork() erstellt das Programm einen Thread und führt ihn erneut aus wird auf false gesetzt. Wir verwenden diese Variable hauptsächlich, um festzustellen, ob der aktuelle Thread ein untergeordneter Thread ist.

Sie können auch feststellen, dass jeder untergeordnete Thread nach der Erstellung Port 8000 abhört, ohne Konflikte zu verursachen. Dies ist die Funktion von gemeinsam genutzten Cluster-Ports.

Kommunikation zwischen Threads

Wenn Threads erstellt werden, teilen sie weder Speicher noch Daten miteinander. Der gesamte Datenaustausch kann nur im Hauptthread über worker.send und worker.on('message', handler) verarbeitet werden. Hier ist ein Beispiel für ein Broadcast-System.

Code kopieren Der Code lautet wie folgt:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {

var Worker=[];
//Neuen Worker erstellen
Funktion newWorker(){
var worker=cluster.fork();

// Informationen anhören. Wenn der Typ gesendet wird, wird bestimmt, dass er gesendet wird
worker.on('message', function(msg) {
If(msg.type=='broadcast'){
        var event=msg.event;
//Diese Übertragung an alle Mitarbeiter senden
arbeiter.forEach(function(worker){
worker.send(event);
})
}
});
Rückkehrarbeiter;
}

für (var i = 0; i < numCPUs; i ) {
Workers.push(newWorker());
}

cluster.on('online',function(worker){
console.log('worker %d ist online',worker.id);
})
} sonst {
var worker=cluster.worker;

//Broadcast ist das Senden einer Nachricht vom Typ Broadcast, und Event ist der Broadcast-Inhalt
worker.broadcast=function(event){
worker.send({
Geben Sie ein:'broadcast',
       event:event
});
}

//Es scheint, dass die zurückgegebenen Informationen hier nicht mit worker.on überwacht werden können
process.on('message',function(event){
console.log('worker: ' worker.id ' empfing Ereignis von ' event.workerId);
})

//Übertragung senden
worker.broadcast({
Nachricht:'online',
workerId:worker.id
})
}

Probleme, die Aufmerksamkeit erfordern

Wie oben erwähnt, können Daten nicht zwischen Threads ausgetauscht werden. Der gesamte Datenaustausch kann nur durch Kommunikation zwischen Threads erfolgen. Und die ausgetauschten Daten sind alle serialisierbar, sodass Dinge wie Funktionen, Dateideskriptoren und HttpResponse nicht übergeben werden können.

Wenn Sie Cluster verwenden, müssen Sie das Problem des Datenaustauschs während des Programmentwurfs berücksichtigen. Mein eigener Ansatz besteht darin, Daten wie Sitzungen in Redis zu speichern, und jeder Thread greift gut darauf zu im Knotenspeicher.

Letzter Punkt: Der Cluster ist derzeit vom Knoten offiziell als experimentell gekennzeichnet und die API kann sich in Zukunft ändern.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage