繁体   English   中英

nodejs http 模块中的 response.write 是否阻塞?

[英]is response.write in nodejs http module blocking?

当我用一个大字符串(比如 150 毫秒)调用 expressjs 响应 object 的 response.write 方法时,我看到了漫长的等待。 我想知道它是否确实阻塞了主线程,如果是,我们如何避免这种情况。

请注意,我不能使用 res.send,因为我稍后会在我的代码中编写一些其他块。

示例代码:

router.get('/*', async (req, res) => {
  const str = "some big string like 256KB"
  res.write(str) // this seems to take 150 ms to go to the next line.
})

res.write()最终使用stream.write()并且在技术上没有阻塞。 它不会等到所有可能的字节都发送完毕后才返回。 它将调用操作系统发送第一个块,返回所需的时间可能特定于您的操作系统。

如果尚未发送所有字节并且它正在等待 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 上的drain事件,则res.write()的返回值将为false ,然后它才能发送下一个数据块。 res.write()的可选回调将告诉您何时所有字节都已移交给操作系统。

执行res.write()的 150 毫秒时间很奇怪。 我在 Windows 11 系统上制作了一个 10MB 的字符串并在其上调用res.write() ,它返回需要 5 毫秒,完全发送需要 17 毫秒(如res.write()的回调所示)。 显然,其中一些因计算机、操作系统和网络而异,但这远不及 150 毫秒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM