当stdout超过缓冲区大小时,为什么仅发出一个'数据'事件?

编程入门 行业动态 更新时间:2024-10-09 10:23:53

当stdout超过<a href=https://www.elefans.com/category/jswz/34/1768630.html style=缓冲区大小时,为什么仅发出一个'数据'事件?"/>

当stdout超过缓冲区大小时,为什么仅发出一个'数据'事件?

背景:(很多,我建议先阅读下面的内容)

我假设到达highWaterMark时节点刷新标准输出。它是否正确?根据此stackoveflow,答案似乎是肯定的。假设这样,如果超出了高水位线,则多余的字符应该再次刷新,对吧?

Node似乎忽略了高水位标记,并且仅冲洗一次,而不管缓冲区大小如何。

示例代码以预期/实际结果重现了我的问题:

import { spawn } from "child_process"

// 8192*2 (16384 aka 16KB) is the highWaterMark (aka buffer size?)
const node_process = spawn("node", ["-e", "process.stdout.write('a'.repeat(8192*2+1));setTimeout(()=>{console.log('done')},4000)"])

node_process.on('error', err => console.error(err))

let numFlushes = 0
node_process.stdout.on('data', (buffer: Buffer) => {
    numFlushes += 1
    const str = buffer.toString()
    console.log(`flush number: ${numFlushes}\
    Buffer length: ${buffer.length}`)
    if (buffer.length < 20) console.log(str)
})

/*
Expected result: 3 flushes, one when highWaterMark is reached, another with rest of stdout, final with done log
Acutal result: 2 flushes. All of stdout is recieved at once. 4 seconds later comes the done log.
Related docs: .x/api/stream.html#stream_buffering
OUTPUT (courtesy of quokka)
flush number: 1    Buffer length: 16385
  at ​​​`flush number: ${ numFlushes }\ Buff...​​​ ​personal/test_node_buffer.ts:11:4
flush number: 2    Buffer length: 11
  at ​​​`flush number: ${ numFlushes }\ Buff...​​​ ​personal/test_node_buffer.ts:11:4
done
  at ​​​str​​​ ​personal/test_node_buffer.ts:13:8
*/

我已经在Windows 10上对此进行了测试。在Linux上,如果您执行* 8 + 2,则按预期有3次刷新。奇。除此之外,这两个平台具有相同的行为。

/@almenon/testBufferSize

回答如下:

https://github/nodejs/node/issues/33465

节点“在感觉到它时发出数据事件”

是的,这就是答案。我计划在接受之前进一步研究它以确认。

更多推荐

当stdout超过缓冲区大小时,为什么仅发出一个'数据'事件?

本文发布于:2024-05-07 20:56:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1757218.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:缓冲区   小时   事件   数据   stdout

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!