如何在不使用阻塞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了错误,但是在我通过through2
pipe道后,它工作。 (不知道这是为什么)。
编辑:一些观察:似乎pipe并不总是双工stream,所以你可能需要两个pipe道。 而且有一些奇怪的事情发生在一种情况下,只有当我也有一个ipc频道,所以共有6个[stdin,stdout,stderr,pipe,pipe,ipc]。