Подтвердить что ты не робот

Если передача потока, записываемого в файл, в конструктор консоли в Node.js, записывается в него асинхронно?

Я прочитал документы о объекте Console и Заметка о процессах ввода-вывода, но не могу понять, следующее приведет к синхронной или асинхронной операции:

const out = fs.createWriteStream('./out.log')
const logger = new Console(out)

logger.log('foo')

Мне интересно, как это действует, особенно в системе * Nix. Но я бы не ожидал, что это по-другому пойдет на Windows. Причина, по которой я спрашиваю, заключается в том, что я создал регистратор, который использовал объект Console, но я не хочу, чтобы регистратор блокировался при записи журналов в файлы во время производства.

4b9b3361

Ответ 1

Он будет асинхронным.

Внутренне Console класс поддерживает обратный вызов _stdoutErrorHandler для запуска после завершения операции записи и проверки ошибок. Мы можем проверить асинхронность, используя его.

const fs = require('fs');
const { Console } = require('console');
const str = new Array(100).fill('').map(() => 'o'.repeat(1000 * 1000)).join('');
const out = fs.createWriteStream('./o.txt');
const logger = new Console(out);
logger._stdoutErrorHandler = () => { console.log('written');};
logger.log(str);
console.log('hey');

Вы увидите, что "эй" печатается до "написано".

Замечание о процессе ввода/вывода относится к process.stdin и process.stdout, которые являются особыми потоками. Когда они указывают на файлы, как в следующем:

$ node someCode.js > file.txt

... в Unix операция записи в Unix будет синхронной. Это обрабатывается в строках здесь. В таких случаях поток process.stdout будет связан с файлом, а не с обычным файловым дескриптором unix fd1.

Ответ 2

TL;DR;
Согласно официальной документации Node, то, что вы здесь делаете, синхронно, потому что вы используете файлы.


Писания могут быть синхронными в зависимости от того, что представляет собой поток подключен ли и является ли система Windows или Unix:

  • Файлы: синхронно в Windows и Linux
  • TTY (терминалы): асинхронный Windows, синхронно в Unix
  • Трубы (и сокеты): синхронно на Windows, асинхронный в Unix

Предупреждение. Я настоятельно рекомендую не использовать эти синхронные действия для производственных сервисов, потому что синхронные записи блокируют цикл событий до тех пор, пока запись не завершится. Это может быть серьезным недостатком при ведении журнала производства.

Ссылка: Node.js Официальная документация/примечание о процессе ввода/вывода