Node.js делегирует многопоточность? - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть пример кода с экспресс-сервером с конечной точкой REST, который выполняет операцию fs.readFile.Я понимаю, что операция является асинхронной и не блокирует основной поток, работающий как однопоточный процесс.Но я хочу уточнить, что происходит, когда к серверу Node.js поступают сотни запросов, а запросы помещаются в очередь ввода-вывода. Есть ли здесь какая-либо многопоточность для операции чтения файла, которая происходит в фоновом режиме при вводе-выводеуровень?или это тоже однопотоковая операция тоже?если это так, не будет ли узким местом большое количество запросов?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Файловый ввод / вывод в 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 документация по пулу потоков и его настройка

0 голосов
/ 08 декабря 2018

Ссылка cloudburst.io в комментариях - это подробное объяснение.

Короткая версия состоит в том, что сам процесс узла является однопоточным, но он полагается на ОС для обработки задач ввода-вывода и тому подобного, отслеживая ожидающие обратные вызовы с помощью файловых дескрипторов.

Это означает, что ответ на ваш вопрос «более или менее», поскольку предполагает, что ОС обладает поддерживающими функциями.Большинство так и делают, так что это безопасная ставка, но не для всех операций ввода-вывода гарантировано.

...