如何在不使用阻塞stdio的情况下从node.js中的子进程传输/流式传输大数据?

Bar*_*vds 9 stream child-process node.js

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

当我阅读手册时,它说它们之间的stdio和ipc接口是阻塞的,所以不会这样做.

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

我想我可能会使用网络套接字,但我担心这会产生不必要的开销.

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

Bar*_*vds 9

我发现了一个似乎有效的解决方案:在生成子进程时,您可以传递选项stdio并设置管道来传输数据.

诀窍是添加一个额外的元素,并将其设置为'管道'.

进程流中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);
Run Code Online (Sandbox Code Playgroud)

在文件描述符3的de child open stream中.

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

// write to it
var writable = fs.createWriteStream(null, {fd: 3});
Run Code Online (Sandbox Code Playgroud)

请注意,并非您从npm获得的每个流都能正常工作,我尝试了JSONStream.stringify()但是它创建了错误,但是在我通过管道输入之后它才有效through2.(不知道为什么会这样).

编辑:一些观察:似乎管道并不总是双工流,所以你可能需要两个管道.并且有一些奇怪的事情发生在一个案例中,只有我还有一个ipc频道才有效,所以总共6个:[stdin,stdout,stderr,pipe,pipe,ipc].