Является ли `fs.readFile` эквивалентным` setTimeout (fs.readFileSync) `? - PullRequest
0 голосов
/ 07 октября 2019

Общие замечания заключаются в том, что асинхронное чтение файлов выполняется быстрее. Я хочу знать, есть ли базовая деталь реализации, которая делает fs.readFile принципиально отличной от fs.readFileSync ИЛИ, если размещение «синхронного» вызова внутри асинхронного контекста делает его неотличимым от асинхронного чтения файла.

Спасибо!

1 Ответ

2 голосов
/ 07 октября 2019

fs.readFile эквивалентно setTimeout(fs.readFileSync)?

Нет, эти два значения не совпадают вообще. fs.readFileSync() блокирует цикл обработки событий и ВСЕ другое выполнение на всю продолжительность операции readFile. Помещение его в setTimeout() просто меняет его при запуске, это не меняет того факта, что цикл событий по-прежнему блокируется на весь период чтения файла (когда он выполняется).

Сказал по-другому, setTimeout() влияет только на то, когда он выполняется (до некоторого времени в будущем), он не перемещает свое выполнение за пределы основного цикла событий, когда он действительно выполняется.

fs.readFile(), с другойhand, выполняет чтение всех файлов вне потока javascript (используя собственные потоки в libuv) и не блокирует. Вы звоните fs.readFile(), и он немедленно возвращается, позволяя вашему коду выполнять другие действия. Другие события могут быть обработаны, и другой код может выполняться, пока он читает файл. Цикл событий не блокируется во время чтения файла. Затем, когда весь файл будет прочитан, событие будет опубликовано в цикле событий, и основной поток Javascript будет уведомлен о завершении чтения файла.

Что я хочу знать, так этоесли есть базовая деталь реализации, которая делает fs.readFile принципиально отличной от fs.readFileSync

Да, есть принципиальная разница. fs.readFile() является асинхронным и выполняет чтение своего файла в другом потоке из потока Javascript. Это не блокирует. Пока он выполняет чтение файла в другом потоке, может работать другой Javascript.

fs.readFileSync() блокирует. Это означает, что в течение всего времени чтения файла цикл событий блокируется, и никакой другой Javascript не может работать.

...