- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个代码:
const { Writable } = require('stream')
let writable = new Writable({ highWaterMark: 10 })
writable._write = (chunk, encoding, cb) => {
process.stdout.write(chunk)
}
function writeData(iterations, writer, data, encoding, cb) {
(function write() {
if (!iterations--) return cb()
if (!writer.write(data, encoding)) {
console.log(` <wait>: highWaterMark reached`)
writer.once('drain', write) // same result when I comment this line
}
})()
}
writeData(4, writable, 'String longer than highWaterMark', 'utf8', () => console.log('Done'))
当我评论检查 'drain'
事件以再次写入的代码时,我得到了相同的结果。
String longer than highWaterMark <wait> highWaterMark reached
看起来 Node 会自动执行此操作,那么为什么我们自己手动监听 'drain'
事件呢?
最佳答案
如果您不等待 drain
事件, Node 将继续缓冲您的 block ,直到出现最大内存使用量。
一旦达到 highWaterMark
阈值, Node 将尝试刷新缓冲区并写入磁盘,但这发生在事件循环的下一个滴答声中,所以如果你不等待(你继续写),这永远不会发生。
I have the same result when I comment the code that check for a 'drain' event to write again.
你有相同的最终结果,因为你没有多次调用 .write
(足以达到内存限制)。但是,如果您对正在写入的文件执行 tail -f
,您将看到在您的进程退出之前没有写入任何内容,或者在这种情况下您的 writeData
函数结束。但是如果您尊重排水管,您会看到文件正在写入(highWaterMark
字节),而您的进程仍在运行。
无需等待,您的代码将阻塞事件循环,直到文件完全写入,这与使用 fs.writeFileSync
几乎相同。因此,如果您在具有数千个并发请求的服务器上执行此操作,您就会理解等待耗尽事件发生的重要性。
你可以检查这个问题,在那里你会看到 .write
是如何进行缓冲的,如果你不等待 drain 事件会发生什么:why does attempting to write large a large file cause js heap to run out of memory
It seems like Node does that automatically, so why bother our-self listening for 'drain' event manually ?
当您使用 .pipe
而不是 .write
时,Node 会为您处理它
const read = fs.createReadStream('/tmp/file.txt');
const write = fs.createWriteStream('/tmp/copy.txt');
read.pipe(write); // You don't have to handle `drain`
关于javascript - Node : Does a writable stream wait for the drain event automatically before writing again?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51063278/
当我使用 sinfo我看到以下内容: $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST [...] RG3 up 2
Rust 具有排空整个序列的功能, If you do need to drain the entire sequence, use the full range, .., as the argume
从表面上看,两者都像drain和 into_iter提供类似的迭代器,即遍历集合的值。然而,它们是不同的: fn main() { let mut items1 = vec![0u8, 1,
我有这段代码: const file = fs.createWriteStream('./test.txt'); let written = true; // handler is added bef
documentation for write()说: Returns false to indicate that the kernel buffer is full, and the data w
来自 doc : write(data) Write data to the stream. This method is not subject to flow control. Calls to
在许多书籍和许多网站上,我看到 -drain。嗯,对于一个听起来很酷的自动释放池来说。但它除了发布之外还有其他作用吗?我猜 -drain 只是让池释放它的所有对象,而不释放池本身。只是猜测。 最佳答案
我正在使用 MongoMemoryServer 编写集成测试。我有两个集成测试文件。当我运行 IT 测试时,我看到以下内容。我不明白为什么。我正在使用 jestjs 测试框架。 当我有两个 IT 测试
我正在尝试使用以下程序写入一个大文件 // this program will result in "JavaScript heap out of memory" const fs = require
嗨,我们已经创建了一个从 pcf 到 logstash 的 Syslog Drain,但有时我们会得到 2018-07-19T15:09:53.524+05:30 [LGR/] [ERR] Syslo
我的游戏通过通常的方法播放声音: sdl.open(); sdl.start(); sdl.write(data, 0, data.length); sdl.drain(); sdl.stop();
我面临一个有趣的问题。我们运行基于状态的基于 HTTPS 的应用程序。状态是基于 session cookie 维护的。该应用程序的设计方式是,如果 session 突然终止,该应用程序将恢复到主屏幕
我正在创建一个短片然后播放它,调用 start() 方法。然后我调用 drain() 方法来阻止执行,直到剪辑播放完成。但是,多次运行下面的代码时,有时有效,有时无效,并且声音在结束前随机停止。 Mi
我在我的 Flutter 应用程序中按照 BLOC 模式使用 dart Streams,所以从逻辑上讲,每当我用完一个 Bloc 时,我都需要处理其中的所有流。 因此,在有状态小部件提供的处置方法上,
这是我的代码模板: int main(int argc, char *argv[]) { // create an autorelease pool NSAutoreleasePool
我正在尝试使用回调来指示所有 async worker 何时完成,但我遇到了可怕的 TypeError: callback is not a function. 我想单独处理数据中的每个元素,并在完成
我正在尝试在 Ubuntu Hardy 上编译以下 Objective-C 程序,但由于某些原因,我收到了警告。 #import int main (int argc, char *argv[])
我正在使用 cocos2d 制作一个基于加速度计的应用程序,我注意到可以设置加速度计更新间隔。 [[UIAccelerometer sharedAccelerometer] setUpdateInte
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: What's the difference between sending -release or -dra
医生说: In a garbage-collected environment, sending a drain message to a pool triggers garbage collecti
我是一名优秀的程序员,十分优秀!