Файловый ввод / вывод в node.js использует пул потоков (для собственного кода, связанного с файловыми операциями).Существует очередь для ожидающих файловых операций ввода-вывода, и каждый поток в пуле потоков берет событие из очереди, обрабатывает его, завершает его, запускает событие завершения и затем получает следующую ожидающую операцию файлового ввода-вывода из очереди иобрабатывает его.
Со стороны Javascript все это неблокирует.Когда вы вызываете одну из асинхронных файловых операций, она передается подсистеме файлового ввода-вывода и сразу же возвращает управление движку JS для запуска другой JS.Некоторое время спустя, когда внутренняя система завершает операцию ввода-вывода файла, и событие добавляется в очередь событий node.js, а когда все, что JS выполняло в это время, завершается и переходит к следующему событию в очереди событий node.js, тогдавызывается обратный вызов, связанный с завершением этой асинхронной файловой операции, и запускается связанный с ним JS.
У меня есть пример кода с экспресс-сервером с конечной точкой REST, которая выполняет операцию fs.readFile,Я понимаю, что операция является асинхронной и не блокирует основной поток, работающий как однопоточный процесс.
Это правильно.
Но я хочу уточнить, что происходит, когдаЕсть сотни запросов к серверу Node.js, и запросы помещаются в очередь ввода / вывода. Есть ли здесь какая-либо многопоточность для операции чтения файла, которая происходит в фоновом режиме на уровне ввода / вывода?
Сотни запросов будут складываться во внутренней очереди файлового ввода-вывода, и они будут обрабатываться N одновременно за счет потоков N в пуле потоков, используемых для внутреннего собственного кода для файлового ввода-вывода.О.
или это тоже однопотоковая операция?Если это так, не будет ли это узким местом для большого количества запросов?
Это N потоков за раз (количество потоков в пуле потоков).Да, это было бы узким местом.Выполнение сотен запросов к файлам в одно и то же время всегда будет своего рода узким местом, независимо от того, как оно запрограммировано, поскольку на самом низком уровне диск может искать только в одном месте за раз и считывать одну часть диска за раз,Размер пула потоков внутри node.js является контролируемым, но если все ваши запросы дискового ввода-вывода направляются на один и тот же базовый диск, вы достигнете точки, в которой вы не добьетесь эффективности, добавив больше потоков, которые всеборясь за одну и ту же головку чтения / записи на диске.
Если вы хотите больше узнать о том, как работает цикл событий node.js и другие подсистемы, есть много полезных статей на эту тему.:
Как работает однопоточный механизм Node.Js?Понимание цикла событий в NodeJs
Обработка ввода-вывода - цикл событий NodeJS, часть 4
Как работает цикл событий node.js
Цикл событий Node.js, таймеры и process.nextTick ()
libuv документация по пулу потоков и его настройка