Sök…


Introduktion

Node.js har utformats för att vara enkeltrådad. Så för alla praktiska ändamål kommer applikationer som startas med Node att köras på en enda tråd.

Men Node.js själv kör flera trådar. I / O-operationer och liknande kommer att köras från en trådpool. Vidare kommer alla instanser av en nodapplikation att köras på en annan tråd, därför startar man flera instanser för att köra flertrådade applikationer.

Anmärkningar

Att förstå Event Loop är viktigt för att förstå hur och varför man använder flera trådar.

Klunga

cluster tillåter en att starta samma applikation flera gånger.

Clustering är önskvärt när de olika instanserna har samma körström och inte är beroende av varandra. I det här scenariot har du en master som kan starta gafflar och gafflar (eller barn). Barnen arbetar självständigt och har ett utrymme med Ram och Event Loop.

Att skapa kluster kan vara fördelaktigt för webbplatser / API: er. Varje tråd kan betjäna alla kunder, eftersom det inte beror på andra trådar. En databas (som Redis) skulle användas för att dela cookies, eftersom variabler inte kan delas! mellan trådarna.

// runs in each instance
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

console.log('I am always called');

if (cluster.isMaster) {
    // runs only once (within the master);
    console.log('I am the master, launching workers!');
    for(var i = 0; i < numCPUs; i++) cluster.fork();

} else {
    // runs in each fork
    console.log('I am a fork!');
  
    // here one could start, as an example, a web server
  
}

console.log('I am always called as well');

Barnprocess

Barnprocesser är vägen att gå när man vill köra processer oberoende med olika initialiseringar och problem. Liksom gafflar i kluster child_process ett child_process i sin tråd, men till skillnad från gafflar har det ett sätt att kommunicera med sin förälder.

Kommunikationen går båda vägar, så att förälder och barn kan lyssna efter meddelanden och skicka meddelanden.

Förälder (../parent.js)

var child_process = require('child_process');
console.log('[Parent]', 'initalize');

var child1 = child_process.fork(__dirname + '/child');
child1.on('message', function(msg) { 
    console.log('[Parent]', 'Answer from child: ', msg); 
});

// one can send as many messages as one want
child1.send('Hello'); // Hello to you too :)
child1.send('Hello'); // Hello to you too :)

// one can also have multiple children
var child2 = child_process.fork(__dirname + '/child');

Barn (../child.js)

// here would one initialize this child
// this will be executed only once
console.log('[Child]', 'initalize');

// here one listens for new tasks from the parent
process.on('message', function(messageFromParent) {
    
    //do some intense work here
    console.log('[Child]', 'Child doing some intense work');

    if(messageFromParent == 'Hello') process.send('Hello to you too :)');
    else process.send('what?');
    
})

Bredvid meddelandet kan man lyssna på många händelser som "fel", "ansluten" eller "koppla bort".

Att starta en barnprocess har en viss kostnad i samband med det. Man skulle vilja leka så få av dem som möjligt.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow