2014-07-05 4 views
8

Ho un sacco di processi (figlio) in node.js che devono trasferire grandi quantità di dati.Come trasferire/trasmettere grandi dati da/a processi figli in node.js senza utilizzare lo stdio di blocco?

Quando ho letto il manuale, dice che l'inferdire stdio e ipc tra loro sta bloccando, quindi non lo farà.

Sto esaminando tramite descrittori di file, ma non riesco a trovare un modo per lo streaming da loro (vedi mia altra domanda più specifica How to stream to/from a file descriptor in node?)

penso che potrei usare una presa di rete, ma ho paura che ha indesiderato spese generali.

Ho anche vedere questo, ma non è la stessa (e non ha risposte: How to send huge amounts of data from child process to parent process in a non-blocking way in Node.js?)

risposta

9

ho trovato una soluzione che sembra funzionare: quando la deposizione delle uova il processo figlio è possibile passare le opzioni per stdio e la configurazione di un tubo a flusso di dati.

Il trucco è aggiungere un elemento aggiuntivo e impostarlo su "pipe".

Nel flusso di processo genitorechild.stdio[3].

var opts = { 
    stdio: [process.stdin, process.stdout, process.stderr, 'pipe'] 
}; 
var child = child_process.spawn('node', ['./child.js'], opts); 

// send data 
mySource.pipe(child.stdio[3]); 

//read data 
child.stdio[3].pipe(myHandler); 

In de bambino flusso aperto per il descrittore di file 3.

// read from it 
var readable = fs.createReadStream(null, {fd: 3}); 

// write to it 
var writable = fs.createWriteStream(null, {fd: 3}); 

Notare che non ogni flusso che si ottiene da NPM funziona correttamente, ho provato JSONStream.stringify() ma ha creato gli errori, ma ha funzionato dopo L'ho collegato via through2. (non so perché sia ​​così).

Modifica: alcune osservazioni: sembra che la pipe non sia sempre Stream Duplex, quindi potrebbero essere necessari due tubi. E c'è qualcosa di strano in cui in un caso funziona solo se ho anche un canale ipc, quindi 6 totali: [stdin, stdout, stderr, pipe, pipe, ipc].

+0

Per quanto riguarda la modifica: potrei sbagliarmi (non ho familiarità con la base del codice nodo), ma [sembra] (https://github.com/nodejs/node/blob/v4.x/lib/internal /child_process.js#L313) che 'stdin' è l'unica pipe garantita per essere scrivibile dal processo padre. –

Problemi correlati