¿Cómo transferir / transmitir grandes volúmenes de datos desde / a procesos secundarios en node.js sin usar el stdio de locking?

Tengo un montón de procesos (secundarios) en node.js que necesitan transferir grandes cantidades de datos.

Cuando leí el manual, dice que el inferface de stdio y ipc entre ellos se está bloqueando, por lo que no funciona.

Estoy estudiando el uso de descriptores de archivos, pero no puedo encontrar una forma de transmitirlos (vea mi otra pregunta más específica ¿ Cómo transmitir a / desde un descriptor de archivos en el nodo? )

Creo que podría usar un socket de red, pero me temo que tiene gastos indirectos no deseados.

También veo esto pero no es lo mismo (y no tiene respuestas: ¿Cómo enviar grandes cantidades de datos del proceso hijo al proceso padre de forma no bloqueable en Node.js? )

Encontré una solución que parece funcionar: cuando se genera el proceso hijo, puede pasar opciones para stdio y configurar una canalización para transmitir datos.

El truco consiste en agregar un elemento adicional y configurarlo en ‘pipe’.

En la secuencia del proceso padre a 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 the child open stream para descriptor de archivo 3.

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

Tenga en cuenta que no todas las transmisiones que obtiene de npm funcionan correctamente, probé JSONStream.stringify() pero creó errores, pero funcionó después de haberlo canalizado a través de through2 . (ni idea de por qué es eso).

Edición: algunas observaciones: parece que la tubería no siempre es un flujo dúplex, por lo que es posible que necesite dos tuberías. Y está sucediendo algo extraño en un caso en el que solo funciona si también tengo un canal ipc, por lo que 6 en total: [stdin, stdout, stderr, pipe, pipe, ipc].