write()(无回调)是否保留 node.js 写入流中的顺序?
Does write() (without callback) preserve order in node.js write streams?
我有一个 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 ,第 2 行,第 3 行)。换句话说,我不知道是否应该使用这个替代方案(更复杂的代码并且不确定效率是否较低):
writeStream.write(line1, ..., function() {
writeStream.write(line2, ..., function() {
writeStream.write(line3);
});
});
(或使用 async series() 的等效替代方案)
根据经验,在我的测试中,我总是按照所需的顺序写入文件(我的意思是,第 1 行,然后是第 2 行,最后是第 3 行)。但是,我现在不知道这是偶然发生的,还是以上是使用 write() 的正确方法。
我知道在流中写入通常是异步的(因为所有 I/O 工作都应该如此)但我想知道 node.js 中的流是否保留内部缓冲区或类似的东西来保持数据有序,所以每个 write() 调用不会 return 直到数据被放入这个缓冲区。
非常欢迎在实际程序中使用 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()
操作不会 return 直到数据已成功复制到缓冲区中。
请注意,如果您要写入大量数据,则可能需要注意流上的流量控制(通常称为背压)。它可以备份并可能会告诉您需要等待才能写入更多内容,但它确实会按照您发送的顺序缓冲您的写入。
如果 .write()
操作 returns false
,则流告诉您需要等待 drain
事件再写入。您可以在 node.js docs for .write()
and in this article about backpressure.
中阅读有关此问题的信息
您的代码还需要侦听 error
事件以检测写入流时的任何错误。因为写入是异步的,它们可能会在稍后发生,并且不一定反映在 .write()
的 return 值或 .write()
回调的 err
参数中.您必须监听 error
事件以确保您在流中看到错误。
我有一个 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 ,第 2 行,第 3 行)。换句话说,我不知道是否应该使用这个替代方案(更复杂的代码并且不确定效率是否较低):
writeStream.write(line1, ..., function() {
writeStream.write(line2, ..., function() {
writeStream.write(line3);
});
});
(或使用 async series() 的等效替代方案)
根据经验,在我的测试中,我总是按照所需的顺序写入文件(我的意思是,第 1 行,然后是第 2 行,最后是第 3 行)。但是,我现在不知道这是偶然发生的,还是以上是使用 write() 的正确方法。
我知道在流中写入通常是异步的(因为所有 I/O 工作都应该如此)但我想知道 node.js 中的流是否保留内部缓冲区或类似的东西来保持数据有序,所以每个 write() 调用不会 return 直到数据被放入这个缓冲区。
非常欢迎在实际程序中使用 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()
操作不会 return 直到数据已成功复制到缓冲区中。
请注意,如果您要写入大量数据,则可能需要注意流上的流量控制(通常称为背压)。它可以备份并可能会告诉您需要等待才能写入更多内容,但它确实会按照您发送的顺序缓冲您的写入。
如果 .write()
操作 returns false
,则流告诉您需要等待 drain
事件再写入。您可以在 node.js docs for .write()
and in this article about backpressure.
您的代码还需要侦听 error
事件以检测写入流时的任何错误。因为写入是异步的,它们可能会在稍后发生,并且不一定反映在 .write()
的 return 值或 .write()
回调的 err
参数中.您必须监听 error
事件以确保您在流中看到错误。