Node.js的可写流和drain事件

Aar*_*lla 8 streaming node.js

write()文档说:

返回false表示内核缓冲区已满,数据将在以后发送出去.

并且该drain活动的文件说:

在write()方法返回false后,将发出此事件以指示再次写入是安全的.

那是什么意思?drain在我再写之前,我是否必须等待活动?我试图写的数据怎么了?丢了吗?当我在不等待drain事件的情况下拨打电话时会发生什么?

Too*_*ate 6

您可以write()安全地打电话而不关心返回值.当内核缓冲区已满时,Node将缓冲所有写入调用,并按预期顺序推送它们.你并不需要等待'drain'重新编写之前的事件.

(可选)您可以检查返回值,write()然后通知写入Stream的事物缓冲区已满.这正是这样Stream#pipe()做的.

通常,只需使用Stream#pipe(),所有的好东西都会照顾你:)

  • "在不关心返回值的情况下调用`write()`并不完全安全".[current docs](https://nodejs.org/dist/v8.4.0/docs/api/stream.html)说:_"在允许不流失的流上调用`write()`时,Node .js将缓冲所有写入的块,直到最大内存使用量发生,此时它将无条件地中止.即使在它中止之前,高内存使用将导致糟糕的垃圾收集器性能和高RSS(通常不会释放回系统,甚至在不再需要内存之后)."_另见:/sf/ask/2630572381/ (3认同)

Mar*_*nde 6

@TooTallNate 答案是错误的。你绝对应该关心.write返回值。

这意味着什么?我是否必须等待耗尽事件才能再次写入?

是的,当.write返回 false 时,您必须等待。

我试图写入的数据发生了什么变化?那丢了吗?

不,它没有丢失,它以正确的顺序缓冲。

当我在不等待耗尽事件的情况下调用 write 时会发生什么?

如果您没有正确处理排放事件,您的脚本将阻塞事件循环,并最终耗尽内存限制使您的应用程序崩溃。

我在另一个问题中给出了详细解释:为什么尝试写入大文件会导致js堆内存不足