2014-07-05 6 views
8

Ich habe eine Reihe von (untergeordneten) Prozessen in node.js, die große Datenmengen übertragen müssen.Wie übertragen/streamen große Daten von/zu untergeordneten Prozessen in node.js, ohne das blockierende stdio zu verwenden?

Wenn ich das Handbuch lesen, sagt es die stdio und ipc-Schnittstelle zwischen ihnen blockieren, so dass das nicht tun wird.

Ich suche in Filedeskriptoren verwenden, aber ich kann nicht einen Weg zum Streamen von ihnen (siehe meine anderen speziellere Frage How to stream to/from a file descriptor in node?)

Ich glaube, ich könnte verwenden, um einen Netto-Buchse finden, aber ich fürchte, hat unerwünschte Overhead.

Das sehe ich auch, aber es nicht das gleiche (und hat keine Antworten: How to send huge amounts of data from child process to parent process in a non-blocking way in Node.js?)

Antwort

9

ich eine Lösung gefunden, die zu funktionieren scheint: wenn das Kind Prozess Laichen können Sie Optionen für stdio und Einrichtung passieren ein Rohr Daten streamen.

Der Trick besteht darin, ein zusätzliches Element hinzuzufügen und es auf "pipe" zu setzen.

In der übergeordneten Prozess Prozessstrom zu child.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 Kind offenen Stream für Dateideskriptor 3.

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

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

Beachten Sie, dass nicht jeder streamen Sie von npm bekommen richtig funktioniert, habe ich versucht JSONStream.stringify() aber es Fehler erstellt, aber es funktionierte nach Ich piped es über through2. (Keine Ahnung, warum das so ist).

Edit: einige Beobachtungen: Es scheint, das Rohr ist nicht immer Duplex-Stream, so dass Sie möglicherweise zwei Rohre benötigen. Und da ist etwas Seltsames, wo es in einem Fall nur funktioniert, wenn ich auch einen IPC-Kanal habe, also insgesamt 6: [stdin, stdout, stderr, pipe, pipe, ipc].

+0

In Bezug auf Ihre Bearbeitung: Ich könnte falsch liegen (nicht vertraut mit der Node-Code-Basis), aber [es scheint] (https://github.com/nodejs/node/blob/v4.x/lib/internal /child_process.js#L313), dass 'stdin' die einzige Pipe ist, die garantiert vom übergeordneten Prozess beschreibbar ist. –