Frage Wie übertragen / streamen Sie große Daten von / zu untergeordneten Prozessen in node.js, ohne das blockierende stdio zu verwenden?


Ich habe eine Menge von (Kind-) Prozessen in node.js, die große Datenmengen übertragen müssen.

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

Ich untersuche Dateideskriptoren, aber ich kann keine Möglichkeit finden, von ihnen zu streamen (siehe meine andere spezifischere Frage Wie zu / von einem Dateideskriptor in Knoten zu streamen?)

Ich denke, ich könnte eine Net-Socket verwenden, aber ich befürchte, dass das unerwünschte Overhead hat.

Ich sehe das auch, aber es ist nicht dasselbe (und hat keine Antworten: Wie kann man in Node.js riesige Datenmengen vom untergeordneten Prozess zum übergeordneten Prozess in nicht blockierender Weise senden?)


8
2017-07-05 01:26


Ursprung


Antworten:


Ich habe eine Lösung gefunden, die zu funktionieren scheint: Wenn Sie den Kindprozess erstellen, können Sie Optionen für stdio und richten Sie eine Pipe ein, um Daten zu streamen.

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

In dem Elternteil 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 offener 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});

Beachte, dass nicht jeder Stream, den du von npm bekommst, richtig funktioniert, ich habe es versucht JSONStream.stringify() aber es hat Fehler verursacht, aber es funktionierte, nachdem ich es per piped hatte 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].


9
2017-07-05 06:10