虽然流是Node.js中通过事件在进程内进行背压处理的一个很好的包,但在我的设置中,我在整个进程中运行它,它会给予我同样的背压处理吗?
为了解释我的设置,我运行了两个node.js应用程序,一个作为父应用程序,另一个作为子应用程序,通过process.spawn
方法。由于在子进程和父进程i piped
之间会有大量的数据流,它们的stdin
和stdout
通过流以交叉的方式彼此连接,并且我成功地将数据流传输到它们之间。(子进程=生产者&父进程=消费者)
问题是,如果由于某种原因,父进程在处理过程中出现延迟,或者子进程发布数据的速度比父进程可以处理的速度快,那么反压力的含义是什么?在这种情况下,反压力是否会被流封装自动处理?
为了测试,我在父应用程序上强制延迟了流的消耗,我观察到的是,在子进程中没有发生内存膨胀,这告诉我有些东西正在处理背压。我的假设是stdout的缓冲区大小是固定的,可能是那个把它从溢出中推回来的人,这个假设正确吗?
1条答案
按热度按时间vltsax251#
背压并不会阻止你将数据推入缓冲区,它只是一个标记,你可以遵守不膨胀的缓冲区。
在您的例子中,我猜缓冲区的大小仍然足以让您的子流数据等待父进程处理它,而不需要额外的内存分配。
为了避免背压问题,您可以使用暂停的流,并在
.on('readable', ...)
事件可用时从其中读取数据。