如何在Node.js中以非阻塞方式将大量的数据从subprocess发送到父进程?
我试图从一个subprocess发送一个巨大的JSONstring到父进程。 我最初的做法如下:
child: process.stdout.write(myHugeJsonString);
parent: child.stdout.on('data', function(data) { ...
但现在我读了process.stdout
是阻塞的:
process.stderr
和process.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阻塞(根据上面引用的文档)?
-
不。上面的文档说stdout / stderr,他们绝不会说“所有pipe道”。
-
stdout / stderr被阻塞并不重要。 为了阻塞pipe道,它需要填满,这需要大量的数据。 为了填满,另一端的读者必须读得比你写的慢。 但是……你是另一端,你写了父进程。 所以,只要你的父进程正在运行,它应该从pipe道读取。
一般来说,阻止孩子是一件好事。 如果其产生的数据比父代更快处理,那么最终只有两种可能性:1.它阻塞,所以停止产生数据,直到父节点捕获为止2.它产生的数据比父节点可以消耗的更多,并且将数据caching在本地存储器中直到它达到v8的内存限制,并且进程中止
你可以使用stdout发送你的json,如果你想1)
你可以使用一个新的“pipe道”发送你的json,如果你想2)