如何在不使用阻塞stdio的情况下将大数据从/传输到node.js中的subprocess?

我在node.js中有一些(子)进程需要传输大量的数据。

当我阅读说明书时说,它们之间的stdio和ipc接口是阻塞的,所以这是不行的。

我正在研究使用文件描述符,但我找不到一种方法从他们stream(请参阅我的其他更具体的问题如何stream/从节点中的文件描述符? )

我想我可能会使用一个networking套接字,但我担心有不必要的开销。

我也看到这个,但它不一样(并没有答案: 如何在Node.js中以非阻塞的方式将大量的数据从subprocess发送到父进程? )

我发现了一个似乎可行的解决scheme:在产生subprocess时,您可以传递stdio选项,并设置pipe道来传输数据。

诀窍是添加一个额外的元素,并将其设置为“pipe道”。

进程stream到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); 

在de 儿童打开文件描述符3stream。

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

请注意,不是每一个你从npm获得的stream都能正常工作,我试过JSONStream.stringify()但是它创build了错误,但是在我通过through2pipe道后,它工作。 (不知道这是为什么)。

编辑:一些观察:似乎pipe并不总是双工stream,所以你可能需要两个pipe道。 而且有一些奇怪的事情发生在一种情况下,只有当我也有一个ipc频道,所以共有6个[stdin,stdout,stderr,pipe,pipe,ipc]。