2013-08-24 12 views
10

Prendete questo breve esempio: ho un file chiamato parent.js, con il seguente codice:Node.js - child_process e cluster di confusione

var child_process = require('child_process') 
var forker = child_process.fork(__dirname + '/child.js') 

forker.on('message', function (msg) { 
console.log('PARENT got message:', msg) 
}) 

// sends a message to the forked process? 
forker.send({msg: 'Parent message.'}) 

Prima domanda: mi appare questo diritto? child_process.fork() restituisce il processo forker, non è vero? (? Come child_process.spawn())

Comunque, ecco il codice per child.js:

process.on('message', function (msg) { 
console.log('CHILD got message:', msg) 
}) 

// sends a message to the forker process? why? 
process.send({msg: 'Message from the child.'}) 

Seconda domanda: ciò che process fare riferimento all'interno del processo figlio? All'attuale processo biforcuto credo? Se sì, quando chiamo process.send() sto inviando un messaggio al processo genitore giusto?

Terza domanda: prendere questo esempio (versione semplificata da Node: Up and Running):

var cluster = require('cluster') 

if (cluster.isMaster) { 
    // fork child... 
    var worker = cluster.fork() 
    worker.on('message', function (msg) { 
     // do stuff 
    }) 
} else if (cluster.isWorker) { 
    process.send(aMessage) 
} 

Quello che trovo poco chiaro è: worker è una specie di forker dell'esempio precedente? E process.send() all'interno del lavoratore invia un messaggio al processo forker?

risposta

10

1) child_process.fork() restituisce il processo biforcuto allo stesso modo di child_process.spawn() restituisce il processo appena generato. In effetti, è proprio fork()

[...] un caso speciale della funzionalità spawn() per i processi di deposizione delle uova Node. Oltre ad avere tutti i metodi in una normale istanza di ChildProcess, l'oggetto restituito ha un canale di comunicazione integrato. 1

2) process nel bambino si riferisce al bambino process. Inoltre,

Nel figlio l'oggetto processo avrà un metodo send() e il processo emetterà oggetti ogni volta che riceve un messaggio sul suo canale. 2

sì dentro il bambino possiamo inviare messaged con 'send()' e li possiamo ricevere con .on('message'). Come nel tuo frammento.

3) Come indicato nella documentazione sul modulo cluster su Node.js:

I processi di lavoro sono generati utilizzando il child_process.fork method, in modo che possano comunicare con il genitore tramite IPC e passare Server gestisce indietro e avanti 3

Quindi hai ragione. Il cluster dei nodi avvolge le funzionalità per in un modo più utilizzabile (si prega di fare attenzione che in questo momento il modulo cluster è contrassegnato come sperimentale. Api potrebbe cambiare nel prossimo futuro).

+0

Ok, quindi quando imposto 'process.on ('message')' all'interno di un worker ascolto dai messaggi inviati dal processo master, mentre quando mi piace 'cluster.fork(). On ('message') 'all'interno del processo principale cosa succede in particolare? Chi ascolta i messaggi da chi nel secondo caso? – whatyouhide

+0

il processo figlio, perché 'cluster.fork()' restituisce un processo figlio. – danielepolencic

+0

In realtà giocando con questo codice, finisce che facendo 'cluster.fork(). On ('message')', è il processo master che ascolta i messaggi inviati dal processo appena forato (con 'process.send () '). Per ascoltare i messaggi * dal master *, il master dovrebbe fare 'cluster.fork(). Send()' mentre il worker dovrebbe fare 'process.on ('message')' (o 'cluster.worker.on ('messaggio') '). – whatyouhide

Problemi correlati