Я учился и использовал node.js в течение двух месяцев. Я использовал Express и в сочетании с Mongoose, чтобы написать веб -приложение и набор RESTFUL WEB API. Оглядываясь назад на введение Node.js на домашней странице официального веб-сайта node.js: node.js, использует не блокирующую модель ввода-вывода, управляемую событиями, которая делает ее легкой и эффективной. Итак, что означает неблокирующая модель ввода-вывода?
Неблокирующая модель ввода-вывода
Прежде всего, операции ввода-вывода, несомненно, трудоемки. Когда сервер получает большое количество запросов, создание процесса или потока для каждого запроса также добавляет дополнительные накладные расходы на память и может тратить больше времени и ресурсов.
Поскольку node.js управляется событиями, он использует петли событий для решения проблем с узким местом, вызванными операциями ввода-вывода. В node.js операция ввода -вывода обычно имеет функцию обратного вызова. Когда операция iO завершается и возвращается, будет вызвана функция обратного вызова, а основной поток продолжает выполнять следующий код. Давайте кратко проиллюстрируем эту проблему с примером:
request ('http://www.google.com', function (ошибка, ответ, body) {console.log (body);}); console.log ('Dode!');Этот код означает выдать запрос на «http://www.google.com», и когда запрос возвращает эту функцию обратного вызова, информация о ответе выводится. Из -за выполнения механизма node.js, после запуска этого кода, он немедленно выведет «Готово!» на консоли, а затем выводит информацию о ответе через некоторое время.
Петля мероприятия события
Далее, давайте обсудим механизм цикла событий. Во -первых, давайте поговорим о вызове, например, есть следующий код:
функция a (arg, func) {var a = arg; func (); console.log ('a'); } function b () {console.log ('b');} a (0, b);После того, как код выполнен, функция A сначала перемещается в вызов и становится верхним элементом стека и начинает выполнять A. Во время процесса выполнения функция B вносится в вызов и становится верхним элементом стека. После того, как B выполняется, B выскочил и вызван, и A снова становится главным элементом стека. После того, как A выполняется, выскочил и вызван, и вызов простаивает.
В среде выполнения JavaScript есть очередь сообщения, и сообщение связано с функцией обратного вызова. Когда событие запускается, если событие имеет соответствующую функцию обратного вызова, сообщение будет добавлено в очередь сообщения.
Давайте поговорим о том, что такое цикл событий. После того, как код начинает выполнять, функция постоянно втягивается в вызов. Возьмите пример выше. Запрос выдвигается в вызов, и эта функция сделает HTTP -запрос (этот HTTP -запрос будет передаваться в базовый модуль Node.js), и событие, завершенное одновременно, связано с функцией обратного вызова. Запрос появляется и вызван, и Console.Log подталкивается к вызову для начала выполнения. Когда запрос будет завершен, событие завершения запускается, а в очередь сообщения добавляется сообщение. Очередь сообщения сначала проверяет, простаивается ли вызов. Если вызов не простаивает, он подождает, пока вызов не станет бездействием, и появится голова очереди сообщения. В настоящее время выполняется функция обратного вызова, связанную с сообщением.
краткое содержание
Выше приведено концептуальное резюме неблокирующей модели и цикла событий. Механизм этого цикла событий не только уникален для node.js, а код node.js выполняется одним потоком. Каковы преимущества при столкновении с большим количеством параллельных запросов?
На рисунке выше показана архитектурная диаграмма Node.js. В базовом слое Node.js есть модуль. Когда будет выдан запрос IO, базовый уровень Node.js создаст новый поток для обработки запроса, а затем вернет результат в верхний слой после завершения. Затем, когда есть несколько запросов, базовый модуль node.js будет использовать как можно меньше потоков, чтобы выполнить большинство задач. Если есть бесплатные потоки, это будет продолжать использоваться для других вещей. Это, несомненно, намного умнее и эффективнее для открытия нового процесса или потока для каждого запроса, как упоминалось ранее.
Эта статья является краткой учебной node.js. Если есть какие -либо проблемы или недостатки, приветствуются критика и исправление.