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 не может работать.