gpt4 book ai didi

node.js - write() (不带回调)是否保留 Node.js 写入流中的顺序?

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:19 25 4
gpt4 key购买 nike

我有一个 node.js 程序,在其中使用流将信息写入 SFTP 服务器。像这样的东西(简化版):

var conn = new SSHClient();
process.nextTick(function (){
conn.on('ready', function () {
conn.sftp(function (error, sftp) {
var writeStream = sftp.createWriteStream(filename);
...
writeStream.write(line1);
writeStream.write(line2);
writeStream.write(line3);
...
});
}).connect(...);
});

注意,我没有使用(可选)回调参数(在 write() API specification 中描述),并且我不确定这是否会导致不良行为(即未按以下顺序编写的行:line1、line2、line3 )。换句话说,我不知道是否应该使用这种替代方案(更复杂的代码并且不确定是否效率较低):

writeStream.write(line1, ..., function() {
writeStream.write(line2, ..., function() {
writeStream.write(line3);
});
});

(或使用 async series() 的等效替代方案)

根据我的测试经验,我总是按照所需的顺序写入文件(我的意思是,首先是第 1 行,然后是第 2 行,最后是第 3 行)。但是,我现在不知道这是否只是偶然发生,或者上面是使用 write() 的正确方法。

我知道流中的写入通常是异步的(所有 I/O 工作都应该是异步的),但我想知道 Node.js 中的流是否保留内部缓冲区或类似的东西来保持数据有序,因此每个 write() 调用都不会在数据放入此缓冲区之前不会返回。

非常欢迎在实际程序中使用 write() 的示例。谢谢!

最佳答案

Does write() (without callback) preserve order in node.js write streams?

是的,确实如此。它保留写入该特定流的顺序。您写入的所有数据都会通过流缓冲区进行序列化。

but I wonder if streams in node.js keep an internal buffer or similar that keeps data ordered, so each write() call doesn't return until the data has been put in this buffer.

是的,所有数据都会经过流缓冲区。 .write()除非发生错误,否则直到数据成功复制到缓冲区后操作才会返回。

请注意,如果您要写入大量数据,则可能需要注意流上的流量控制(通常称为背压)。它可以备份,并可能告诉您需要等待才能写入更多内容,但它确实会按照您发送的顺序缓冲您的写入。

如果.write()操作返回false ,然后流告诉您需要等待 drain在写更多内容之前发生的事件。您可以在node.js docs for .write() 中阅读有关此问题的信息。并在 this article about backpressure .

您的代码还需要监听 error事件来检测写入流时的任何错误。由于写入是异步的,因此它们可能会在稍后的某个时间发生,并且不一定反射(reflect)在 .write() 的返回值中。或在 err参数 .write()打回来。你必须听error事件以确保您在流中看到错误。

关于node.js - write() (不带回调)是否保留 Node.js 写入流中的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49865458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com