nodejs - ¿Cómo transferir/transmitir datos grandes desde/a procesos secundarios en node.js sin usar el stdio de bloqueo?
node js ejemplo (1)
Encontré una solución que parece funcionar: al generar el proceso secundario, puede pasar opciones para stdio
y configurar una tubería para transmitir datos.
El truco consiste en agregar un elemento adicional y configurarlo en ''pipe''.
En el flujo de proceso primario 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);
En la secuencia de abrir de child para el 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 secuencias que obtiene de npm funcionan correctamente, probé JSONStream.stringify()
pero creó errores, pero funcionó después de que lo through2
través de through2
. (ni idea de por qué es eso).
Editar: algunas observaciones: parece que la tubería no es siempre una transmisión dúplex, por lo que es posible que necesite dos tubos. Y sucede algo raro donde en un caso solo funciona si también tengo un canal ipc, por lo que 6 en total: [stdin, stdout, stderr, pipe, pipe, ipc].
Tengo un grupo de procesos (secundarios) en node.js que necesitan transferir grandes cantidades de datos.
Cuando leí el manual, dice que la interfaz de stdio e ipc entre ellos están bloqueando, por lo que no funcionará.
Estoy buscando 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 hacia / desde un descriptor de archivo en el nodo? )
Creo que podría usar un conector de red, pero me temo que tiene una sobrecarga no deseada.
También veo esto, pero no es lo mismo (y no tiene respuestas: ¿cómo enviar grandes cantidades de datos desde el proceso hijo al proceso principal de una manera no bloqueante en Node.js? )