Node Up and Running / Node В начале... (рабочее название): --- The Event Loop

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Событийный цикл фундаментальная часть Node, концепция лежащая в поведении JavaScript, а также большинства других интерактивных систем. В множестве языков, модель событий отделена где-то на стороне, но в Javascript события всегда являются частью ядра языка. Это потому что JavaScript всегда имеет дело с взаимодействием пользователя. Кто-нибудь кто использовал новейшие веб браузеры привык к веб страницам делающим такие вещи как “onclick,” “onmouseover,” и др.

rishatsharafiev 01.01.14 в 22:59

0

Эти события такие общие, что мы едва ли думаем о них, когда пишем взаимодействие на веб странице, но имея поддержку этих событий. На сервере мы имеем бесконечное различие событий, базированных на том, что происходит в серверном программном обеспечении, которое мы используем, вместо ограниченного набора событий базированных на запускаемом пользователем взаимодействии с DOM веб страницы. Для примера, модуль сервера HTTP поддерживает вызванный событием request, возбужденный когда пользователь отправляет на сервер запрос.

rishatsharafiev 02.01.14 в 09:44

0

Событийный цикл - это система, которую JavaScript использует для взаимодействия с теми входящими запросами от различных частей системы в нормальным способом. Есть несколько способов, как люди работают с "real-time" или "параллельными" задачами в вычислениях. Большинство из них довольно сложное и откровенно говоря наши мозги кипят. JavaScript использует простой подход, что делает процесс намного более понятным, но здесь вводится несколько ограничений. Имея понимание того, как событийный цикл работает, вы будете способны использовать его в полной мере и избежите ловушек данного подхода.

rishatsharafiev 02.01.14 в 10:18

0

Node берет подход, которые все потоки ввода/вывода должно быть не блокирующим(мы объясним это позже). Это значит, что HTTP запросы, запросы к базе данных, файловый ввод/вывод, и другие вещи, которые требуют от программы подождать, не останавливают выполнение до того как они не вернут данные. Вместо этого, они запускаются независимо, и затем возбуждают событие, когда их данные доступны. Это значит, что программирование на Node.js имеет много функций обратного вызова работающих со всеми видами ввода/вывода. Функции обратного вызова часто запускают другие функции обратного вызова в каскадной манере, которая очень отличается от браузерного программирования. Существует некоторое кол-во линейности, но основной части кода приходиться иметь дело с функциями обратного вызова.

rishatsharafiev 02.01.14 в 11:57

0

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

rishatsharafiev 02.01.14 в 12:01

0

Вместо попытки резать и выключить плиту одновременно, вы достигаете одинаковых результатов в более безопасной манере быстро переключаясь.

rishatsharafiev 02.01.14 в 13:21

0

Рисунок 3-1. Событийно-управляемые люди

rishatsharafiev 02.01.14 в 13:21

0

В повседневной жизни, мы привыкли иметь все виды функций обратного вызова для работы с событиями, и даже к Javascript, мы всегда делаем просто одно действие за раз. Да, да, мы можем видеть, что вы трете свой животик и похлопываете голову, отлично. Но если вы пытаетесь делать какие-то серьезные действия одновременно и довольно таки часто что-то пойдет не так. Это как Javascript. Это здорово позволять событиям управлять действием, но это однопоточно, поэтому всегда одна вещь происходит разом.

rishatsharafiev 02.01.14 в 13:29

0

Однопоточность действительно важна. Одним из замечаний к Node.js довольно часто является отсутствие параллеризма. Он не использует все ядра процессора для запуска Javascript. Проблема с запуском кода на многоядерных процессора одновременно, что требует координации между множеством потоков выполнения. Для того, чтобы несколько ядер эффективно разделяли работу, они должны были бы общаться между собой а текущем состоянии программы. Хотя это возможно, это намного сложная модель, что требует больше усилий от обоих: программиста и системы. Подход JavaScript простой: за раз происходит только одно действие. Все что Node делает не блокируется, поэтому время между возбужденными событиями и доступностью Node к действию над этим событием очень мало, потому что он не ждет таких действий как ввод/вывод диска.

rishatsharafiev 03.01.14 в 12:32

0

Другой путь понять событийный цикл - это сравнить его с почтальоном. Для нашего почтальона событийного цикла, каждое письмо - это событие. Он имеет кучу(стэк) событий для доставки по порядку. Для каждого письма почтальон имеет маршрут, по которому он идет для доставки письма (рисунок 3-2). Маршрут это функция обратного вызова(callback) назначенная на то событие(иногда более чем одно). однако это критично, потому что наш почтальон имеет только единственный набор ног, он может идти только по единственному кодовому пути за раз.

rishatsharafiev 05.01.14 в 15:07

0

Рисунок 3-2. Событийный цикл почтальона.

rishatsharafiev 05.01.14 в 15:07

0

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

rishatsharafiev 05.01.14 в 15:15

0

Давайте посмотрим поведение нашего почтальона в обычной программе, выбрав что-то простое. Предполагается что мы имеем HTTP веб-сервер, который получает запросы, извлекает некоторые данные из базы данных и возвращает их пользователю. В этом сценарии, мы имеем несколько событий для работы. Первое(как в большинстве случаев) приходит событие request от пользователя, спрашивая у веб-сервера веб страницу. callback-функция, которая работает с запуском запроса(давайте звать ее callback A) смотрит в объект-запроса и выясняет какие данные ему нужны из базы данных. Затем она делается запрос к базе данных, передавая в другую функцию, callback B, чтобы вызвать ее при событие response. После обработки запроса, callback A возвращается. Когда база данных найдет данные, она выдаст событие response. Затем событийный цикл вызовет callback B, который отправит данные обратно пользователю.

rishatsharafiev 05.01.14 в 15:32

0

Получив общее представление о циклах обработки событий, давайте посмотрим на стандартный код Node.js для создания HTTP-сервера, как показано в Примере 3-2.

ks_rew 28.09.12 в 05:14

0

Пример 3-2.Простой HTTP-сервер

ks_rew 28.09.12 в 05:22

0

Этот код является самым простым примером на сайте Node.js (но, как мы скоро увидим, это не самое лучшее решение). В этом примере создается HTTP-сервер с помощью фабричного метода из библиотеки http.

ks_rew 28.09.12 в 05:29

0
Минутку...