Автор оригинала: FreeCodeCamp Community Member.
от Pablo Regen
Вы, наверное, прочитали эти предложения до …
… И были оставлены интересно, что все это значило. Надеюсь, к концу этой статьи вам будет лучше понять эти условия, а также о том, какой узел, как он работает, и почему, и когда это хорошая идея использовать его.
Давайте начнем с окончания терминологии.
Ввод/вывод (вход/вывод)
Короче для ввода/вывода, I/O Относится в первую очередь к взаимодействию программы с диском системы и сетью системы. Примеры операций ввода/вывода включают данные чтения/записи из/на диск, что делает HTTP-запросы и разговаривать с базами данных. Они очень медленно по сравнению с доступом к памяти (RAM) или работают на процессоре.
Синхронные против асинхронные
Синхронный (или синхронизация) выполнение обычно относится к выполнению кода в последовательности. В программировании Sync программа выполнена строка по линии, одна строка за раз. Каждый раз вызывается функция, выполнение программы ждет, пока эта функция не возвращается до продолжения следующей строки кода.
Асинхронный (или async) выполнение относится к выполнению, которое не работает в последовательности, оно появляется в коде. В Async-программировании программа не ждет выполнения задачи и может перейти к следующей задаче.
В следующем примере операция синхронизации приводит к тому, что предупреждения о пожаре предупреждают. В операции ASYNC, а оповещение (2), кажется, выполняется секунды, это не так.
// Synchronous: 1,2,3 alert(1); alert(2); alert(3); // Asynchronous: 1,3,2 alert(1); setTimeout(() => alert(2), 0); alert(3);
Операция Async часто связана с I/O, хотя Сетримс
является примером чего-то, что не ввода/вывода, но все равно async. Вообще говоря, все, что связано с вычислением, связано с синхронизацией, и все, что связано с входным/выходом/сроком, а async. Причина операций ввода/вывода, которая будет выполнена асинхронно, заключается в том, что они очень медленные и будут блокировать дальнейшее выполнение кода иначе.
Блокировка против не блокировки
Блокировка Относится к операциям, которые блокируют дальнейшее выполнение до тех пор, пока не завершит эту операцию, пока не блокировка Относится к коду, которое не блокирует выполнение. Или как Node.js Документы кладут его, блокировка – это когда выполнение дополнительного JavaScript в процессе Node.js должно подождать, пока не завершится операция без JavaScript.
Методы блокировки выполняются синхронно в то время как методы безблокировки выполняются асинхронно.
// Blocking const fs = require('fs'); const data = fs.readFileSync('/file.md'); // blocks here until file is read console.log(data); moreWork(); // will run after console.log // Non-blocking const fs = require('fs'); fs.readFile('/file.md', (err, data) => { if (err) throw err; console.log(data); }); moreWork(); // will run before console.log
В первом примере выше, console.log
будет называться до Workwork ()
Отказ Во втором примере Fs.readfile ()
не блокировка, поэтому выполнение JavaScript может продолжаться и Workwork ()
будет называться первым.
В узле, не блокировка в первую очередь относится к операциям ввода/вывода, а JavaScript, которая демонстрирует плохую производительность из-за того, что он не имеет процессора, а не в ожидании операции без JavaScript, таких как I/O, обычно не называется блокировкой.
Все методы ввода/вывода в стандартной библиотеке Node.js предоставляют Async Versions, которые не блокируют и принимают функции обратного вызова. Некоторые методы также имеют блокировку аналогов, которые имеют имена, которые заканчиваются синхронизацией.
Неблокирующие операции ввода/вывода позволяют одному процессу подавать несколько запросов одновременно. Вместо того, чтобы процесс заблокированы и ожидания операций ввода/вывода для завершения, операции ввода/вывода передаются в систему, так что процесс может выполнить следующий кусок кода. Неблокирующие операции ввода/вывода обеспечивают функцию обратного вызова, которая называется, когда операция завершена.
Обратные вызовы
А Обратный вызов Это функция, передаваемая в качестве аргумента в другую функцию, которая затем может быть вызвана (называемой назад) внутри внешней функции, чтобы завершить некоторые действия в удобное время. Вызов может быть немедленным (синхронизация обратного вызова) или может произойти позже (Async Callback).
// Sync callback function greetings(callback) { callback(); } greetings(() => { console.log('Hi'); }); moreWork(); // will run after console.log // Async callback const fs = require('fs'); fs.readFile('/file.md', function callback(err, data) { // fs.readFile is an async method provided by Node if (err) throw err; console.log(data); }); moreWork(); // will run before console.log
В первом примере функция обратного вызова сразу называется функцией внешних приветствий и входит в систему в консоли до Workwork ()
Выручка.
Во втором примере fs.readfile (метод Async, предоставляемый узлом), считывает файл и когда он завершает его, вызывает функцию обратного вызова с ошибкой или содержимым файла. Тем временем программа может продолжить выполнение кода.
Async Callback может быть вызван, когда событие происходит или когда заканчивается задача. Это предотвращает блокировку, позволяя выполнять другой код в то же время.
Вместо этого Из верхней части чтения кода донизу процедурно, Async-программы могут выполнять различные функции в разное время на основе порядка и скорости, что более ранние функции, такие как HTTP-запросы или файловая система. Они используются, когда вы не знаете, когда некоторая асинхронная операция завершится.
Вам следует избегать « Callback Hell », ситуация, когда обратные вызовы вложены в другие обратные вызовы на несколько уровней глубоко, заставляя код трудно понять, поддерживать и отладки.
События и программирование, ориентированное на события
События являются действиями, генерируемыми пользователем или системой, как щелчок, заполненная загрузка файлов или аппаратная или программная ошибка.
Программирование, ориентированное на события Это парадигма программирования, в которой поток программы определяется событиями. Программа, управляемая событиями, выполняет действия в ответ на события. Когда событие возникает, он вызывает функцию обратного вызова.
Теперь давайте постараемся понять узел и посмотреть, как все это связано с этим.
Node.js: Что это, почему это было создано, и как это работает?
Проще говоря, Node.js Это платформа, которая выполняет программы JavaScript Server Side, которые могут взаимодействовать с источниками ввода/вывода, такими как сети и файловые системы.
Когда Райан Даль Созданный узел в 2009 году он утверждал, что ввод/вывод обрабатывается неправильно, блокируя весь процесс из-за синхронного программирования.
Традиционные технологии веб-службы используют модель потока, что означает один нить для каждого запроса. Поскольку в операции ввода/вывода запрос проводит большую часть времени, ожидающего его завершения, интенсивные сценарии ввода/вывода влечет за собой большое количество неиспользуемых ресурсов (таких как память), связанные с этими потоками. Поэтому модель «один поток на запрос» для сервера плохо масштабируется.
DAHL утверждал, что программное обеспечение должно быть в состоянии многозадачевать и предложить устранение времени, затраченного в ожидании результатов ввода/вывода. Вместо модели резьбы он сказал, что правильный способ обрабатывать несколько одновременных соединений, заключался в том, чтобы иметь один нить, контур событий и не блокируя I/OS. Например, когда вы делаете запрос в базу данных, вместо того, чтобы ждать ответа, который вы даете ему обратный вызов, поэтому ваше выполнение может проходить через это оператор и продолжать делать другие вещи. Когда результаты возвращаются, вы можете выполнить обратный вызов.
Структура событий Это позволяет Node.js выполнять неблокирующие операции ввода/вывода, несмотря на то, что JavaScript является однопоточным. Цикл, который работает в том же потоке, что и код JavaScript, снимает задачу из кода и выполняет его. Если задача представляет собой async или операцию ввода/вывода, цикл выгружает ее в систему ядра, как в случае для новых подключений к серверу или в пул резьбы, таких как операции, связанные с файловой системой. Затем петля захватывает следующую задачу и выполняет ее.
Поскольку большинство современных ядер являются многопоточными, они могут обрабатывать несколько операций, выполняющих в фоновом режиме. Когда одна из этих операций завершается (это событие), ядро сообщает Node.js, чтобы соответствующий обратный вызов (тот, который зависел от операции, завершившись), может быть добавлен в очередь опроса для в конечном итоге.
Узел отслеживает незаконченные операции ASYNC, а цикл события продолжает зацикливаться, чтобы проверить, заканчиваются ли они, пока все они не будут.
Чтобы приспособиться к однопоточной контуре события, Node.js использует Libuv Библиотека, которая, в свою очередь, использует фиксированную пул резьба Это обрабатывает выполнение некоторых неблокирующих асинхронных операций ввода-вывода в параллельном уровне. Основные функции вызова потока поступили поставленные задачи к очереди общей задачи, какую нить в пуле резьбы и выполнить.
Несоответствующие функции системы безблокировки, такие как сетевые, переводят к сети, не блокирующие разблокирующие сокеты, в то время как по своей сути, блокируя системные функции, такие как файл ввода/вывода, бегите в блокировке по собственным потокам. Когда нить в пуле нитей завершает задачу, она информирует основной нить этого, которая, в свою очередь, просыпается и выполняет зарегистрированный обратный вызов.
Вышеуказанное изображение взято из презентации Филиппа Робертса в Jsconf EU: Каким черт возьми, вся петля событий? Я рекомендую смотреть полное видео, чтобы получить представление высокого уровня о том, как работает петли для событий.
Диаграмма объясняет, как цикл событий работает с браузером, но он выглядит в основном идентично для узла. Вместо Web API у нас будет API у узла.
Согласно презентации, стек вызовов (стек исполнения AKA или «стек») – это структура данных, которая записывает, где в программе мы находимся. Если мы вступаем в функцию, мы положим что-то на стек. Если мы вернемся от функции, мы выскакиваем его из верхней части стека.
Вот как код в диаграмме обрабатывается при его запуске:
- Толчок
Главная ()
на стек (сам файл) - Толчок
Console.log («Привет»);
на стек, который выполняет немедленное ведение журнала «Привет» на консоль и выскочит со стека - Толчок
Settimeout (CB, 5000)
на стек. Settimeout – это API, предоставленный браузером (на бэкере, это будет API узла). Когда Settimeout вызывается с функцией обратного вызова и раздержка аргументов, браузер выступает от таймера с временем задержки -
Сетримс
Вызов завершен и выходит из стека - Толчок
console.log ('jsconfeu');
на стек, который выполняет немедленно ввение в систему «jsconfeu» на консоль и выскочит со стека Главная ()
получает выпуклость- После 5000 миллисекундов завершен таймер API, и обратный вызов перемещается в очередь задач
- Контур событий проверяет, является ли стек пустым, потому что JavaScript, являясь однопоточными, может сделать только одну вещь за раз (Settimeate не является гарантированным, а минимальное время для выполнения). Если стек пуст, требуется первое в очередь и толкает его на стек. Поэтому цикл нажимает обратный вызов на стек
- Обратный вызов выполняется, логирует «там» на консоль и выскочит со стека. И мы сделали
Если вы хотите пойти даже глубже в деталях на том, как Node.js, libuv, цикл событий и пул резьбы, я предлагаю проверять ресурсы в справочном разделе в конце, в частности это , это и это вместе с Узел Документы Отказ
Node.js: Почему и где его использовать?
Поскольку практически нет функции в узле напрямую не выполняет ввод/вывод, процесс никогда не блокирует (операции ввода/вывода выполняется и выполняется асинхронно в системе), что делает его хорошим выбором для разработки высокоманальных систем.
Благодаря своему ведущему сервируемую телосложую петлю событий и асинхронной модели I/O ввода/вывода Asynchronous, Node.js наилучшим образом выполняет интенсивные приложения ввода/вывода, требующих скорости и масштабируемости с большим количеством одновременных соединений, таких как потоковое видео. -Time приложений, живые чаты, игровые приложения, инструменты для сотрудничества или программное обеспечение для биржевой биржевой биржи.
Node.js не может быть правильным выбором для интенсивной операции CPU. Вместо этого модель традиционной резьбы может работать лучше.
NPM
NPM Это менеджер пакета по умолчанию для Node.js, и он устанавливается в систему, когда устанавливается Node.js. Он может управлять пакетами, которые являются локальными зависимостями определенного проекта, а также на глобально установленные инструменты JavaScript.
www.npmjs.com Ходит тысячи бесплатных библиотек для загрузки и использования в вашей программе, чтобы сделать разработку быстрее и эффективнее. Однако, поскольку для кого-либо может создавать библиотеки, и нет обрабатываемого процесса для подачи, вы должны быть осторожны с низким качеством, небезопасными или вредоносными. NPM опирается на отчеты пользователей для снижения пакетов, если они нарушают политики, и помочь вам решить, он включает в себя статистику, как количество загрузок и количество в зависимости от пакетов.
Как запустить код в Node.js
Начните с установки узла на своем компьютере, если у вас его уже нет. Самый простой способ – посетить nodejs.org и нажмите, чтобы загрузить его. Если вы не хотите или не должны иметь доступ к последним функциям, загрузите версию LTS (долгосрочную поддержку) для вашей операционной системы.
Вы запускаете приложение узла с терминала вашего компьютера. Например, сделайте файл “app.js” и добавьте Console.log («Привет»);
к этому. В вашем терминале измените каталог в папку, где этот файл принадлежит и запущен Узел App.js
Отказ Это будет войти в систему «Привет» на консоль. ?
Рекомендации
Вот некоторые интересные ресурсы, которые я рассмотрел во время написания статьи.
Node.js Презентации его автором:
- Оригинальный Node.js Presentation Ryan Dahl в Jsconf 2009
- 10 вещей, которые я сожалею о Node.js Ryan Dahl в Jsconf EU 2018
Узел, контур событий и презентации библиотеки Libuv:
- Каким черт возьми, вся петля событий? Филипп Робертс в Jsconf ЕС
- Node.js объяснил Джефф Кунчл
- В петле Jake Archibald на Jsconf Asia 2018
- Все, что вам нужно знать о петле событий Node.js Берт отель
- Глубокое погружение в Libuv Saul ibarra Coretge на Nodeconf EU 2016
Узел документы:
- О Node.js.
- Структура событий Node.js, таймеры и процесс. NextTick ()
- Обзор блокировки против безблокировки
Дополнительные ресурсы:
- Искусство узла Макс Огден
- Обратный вызов Ад Макс Огден
- Что такое не блокировка или асинхронный ввод/вывод в Node.js? на переполнении стека
- Программирование, ориентированное на событие на Википедии
- Node.js на Википедии
- Нить на Википедии
- либувна
Спасибо за прочтение.