Сохраняет ли write() (без обратного вызова) порядок в потоках записи node.js?
У меня есть программа 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(...);
});
Примечание. Я не использую (необязательный) аргумент обратного вызова (описанный в спецификации API write ()), и я не уверен, может ли это вызвать нежелательное поведение (то есть строки не записываются в следующем порядке: line1, line2, line3), Другими словами, я не знаю, следует ли использовать эту альтернативу (более сложный код и не уверен, что она менее эффективна):
writeStream.write(line1, ..., function() {
writeStream.write(line2, ..., function() {
writeStream.write(line3);
});
});
(или эквивалентная альтернатива с использованием async series ())
Опытным путем в моих тестах я всегда получал файл, записанный в нужном порядке (я имею в виду, сначала строку1, затем строку2 и, наконец, строку3). Тем не менее, я не знаю, произошло ли это случайно или выше, это правильный способ использования write ().
Я понимаю, что запись в потоке вообще асинхронна (как и должна быть вся работа ввода / вывода), но мне интересно, если потоки в node.js сохраняют внутренний буфер или что-то подобное, что сохраняет порядок данных, поэтому каждый вызов write () не возвращает пока данные не будут помещены в этот буфер.
Примеры использования write () в реальных программах очень приветствуются. Спасибо!
1 ответ
Сохраняет ли write() (без обратного вызова) порядок в потоках записи node.js?
Да, это так. Он сохраняет порядок ваших записей в этот конкретный поток. Все данные, которые вы пишете, проходят через буфер потока, который их сериализует.
но мне интересно, хранят ли потоки в node.js внутренний буфер или что-то подобное, что сохраняет порядок данных, поэтому каждый вызов write () не возвращается, пока данные не будут помещены в этот буфер.
Да, все данные проходят через буфер потока. .write()
операция не вернется, пока данные не будут успешно скопированы в буфер, если не произойдет ошибка.
Обратите внимание, что если вы пишете какой-либо значительный объем данных, вам, возможно, придется обратить внимание на управление потоком (часто называемое обратным давлением) в потоке. Он может выполнить резервное копирование и может сказать, что вам нужно подождать, прежде чем писать больше, но он буферизует ваши записи в порядке их отправки.
Если .write()
операция возвращается false
тогда поток говорит вам, что вам нужно ждать drain
событие, прежде чем писать больше. Вы можете прочитать об этой проблеме в документации по node.js для.write()
и в этой статье о противодавлении.
Ваш код также должен прослушивать error
событие для обнаружения любых ошибок при записи потока. Поскольку записи являются асинхронными, они могут происходить через некоторое время и не обязательно отражаются ни в возвращаемом значении из .write()
или в err
параметр к .write()
Перезвоните. Вы должны слушать за error
событие, чтобы убедиться, что вы видите ошибки в потоке.