如何在Node.js中以非阻塞方式将大量的数据从subprocess发送到父进程?

我试图从一个subprocess发送一个巨大的JSONstring到父进程。 我最初的做法如下:

child: process.stdout.write(myHugeJsonString);

parent: child.stdout.on('data', function(data) { ...

但现在我读了process.stdout是阻塞的:

process.stderrprocess.stdout不同于Node中的其他stream,写入它们通常是阻塞的。

  • 他们阻止的情况下,他们引用常规文件或TTY文件描述符。
  • 在这种情况下,他们指的是pipe道:
    • 他们在Linux / Unix中被阻塞。
    • 它们像Windows中的其他stream一样是非阻塞的。

child_process.spawn的文档说我可以使用pipe选项在subprocess和父进程之间创build一个pipe道。 但是不是在Linux / Unix中pipe理我的stdout阻塞(根据上面引用的文档)?

好的, Stream object选项呢? 嗯,似乎我可以共享一个可读或可写的stream,引用与subprocess的套接字。 这会不会阻塞? 我将如何执行?

所以问题是:如何在Node.js中以非阻塞方式将大量数据从subprocess发送到父进程? 一个跨平台的解决scheme将是非常整洁,例解释非常赞赏。

我在* nix上使用的一个巧妙的技巧就是fifopipe道( http://linux.about.com/library/cmd/blcmdl4_fifo.htm )。 这允许孩子写一个像东西和父母的文件来读取相同的文件。 这个文件并不是真的在fs上,所以你不会得到任何IO问题,所有的访问都是由内核本身来处理的。 但是…如果你想跨平台,那将是行不通的。 Windows上没有这种东西(据我所知)。

只要注意,你定义了pipe道的大小,如果你写的东西(来自子节点)不是由其他东西(从父节点)读取的,那么子节点将在pipe道满时被阻塞。 这不会阻塞节点进程,他们将pipe道视为正常的文件stream。

我有一个类似的问题,我想我有一个很好的解决scheme,通过设置一个pipe道时产卵的subprocess,并使用生成的文件描述符来双工数据到客户端。

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

显然你可以使用fs来stream/从文件描述符:

如何stream入/从节点中的文件描述符?

child_process.spawn的文档说我可以使用pipe选项在subprocess和父进程之间创build一个pipe道。 但是不是在Linux / Unix中pipe理我的stdout阻塞(根据上面引用的文档)?

  1. 不。上面的文档说stdout / stderr,他们绝不会说“所有pipe道”。

  2. stdout / stderr被阻塞并不重要。 为了阻塞pipe道,它需要填满,这需要大量的数据。 为了填满,另一端的读者必须读得比你写的慢。 但是……你是另一端,你写了父进程。 所以,只要你的父进程正在运行,它应该从pipe道读取。

一般来说,阻止孩子是一件好事。 如果其产生的数据比父代更快处理,那么最终只有两种可能性:1.它阻塞,所以停止产生数据,直到父节点捕获为止2.它产生的数据比父节点可以消耗的更多,并且将数据caching在本地存储器中直到它达到v8的内存限制,并且进程中止

你可以使用stdout发送你的json,如果你想1)

你可以使用一个新的“pipe道”发送你的json,如果你想2)