Почему nodejs fs sync синхронный apis блокирует основной поток (даже цикл), когда он должен выполняться в рабочем пуле (по умолчанию для nodejs)? - PullRequest
0 голосов
/ 27 октября 2019

Это теоретический вопрос,

Раньше я думал, что в nodejs дорогие задачи, такие как I / O, Network, ... будут выполняться на работнике в рабочем пуле, а не на цикле событий основного узла,поэтому он не блокирует цикл обработки событий.

Я читал некоторые статьи об этом, например, nodejs docs

Но сегодня я прочитал статью, в которой написано:

"Поскольку асинхронность, безусловно, является лучшим решением для таких случаев, именно синхронные версии методов имеют надлежащий суффикс -Sync. Следует помнить, что использование методов синхронизациипросто крайне не рекомендуется и, при использовании, заблокирует основной поток от выполнения любых других операций. Просто используйте их с осторожностью (и только если вам действительно нужно)! "

Так что, если это правдапочему эти синхронные задачи будут блокировать основной четный цикл, когда он должен выполняться в рабочем пуле?

Спасибо

1 Ответ

1 голос
/ 27 октября 2019

Так что, если это правда, почему эти синхронные задачи будут блокировать основной четный цикл, когда он должен выполняться в рабочем пуле?

Поскольку версии синхронизации специально предназначены для блокировкиОсновной поток, поэтому он будет ждать их завершения, прежде чем вернуться. Они предназначены для блокировки API. Вот для чего они предназначены. Если бы они этого не делали, они были бы неблокирующими и асинхронными, а не блокирующими и синхронными.

Вопрос не в том, в каком потоке выполняется реальная работа. Проблема заключается в том, что версии синхронизации специально предназначены для того, чтобы заставить основной поток ждать, пока они не будут выполнены. Это должно упростить программирование в определенных ситуациях, когда желательно блокирование. Например, весьма часто используется какой-либо синхронный файловый ввод-вывод в коде запуска для сервера. Например, require() блокирует файловый ввод-вывод для загрузки скриптов.

Но, как вы видели в статье, вы хотите использовать асинхронный файловый ввод-вывод, только когда ваш сервер запущен и работаети обработка запросов.

...