Может показаться забавным сказать Мой цикл событий, но после изучения темы, чтобы понять основы Node.js, я, честно говоря, не нашел полного согласия относительно того, что именно цикл событий является. Тем не менее, это мое понимание этой важной концепции и ее места в разработке с использованием JavaScript.

Изображение выше было безвозмездно украдено из работы Филипа Робертса, разработчика, с которым я познакомился по его докладам о цикле событий. На самом деле он заканчивает тем, что говорит обо всей среде выполнения JavaScript, но это будет объяснено позже. Ниже представлена ​​версия его выступления на JSConf EU 2014.

Куча

Для кого-то куча может быть интересна, но в данном контексте она не особо актуальна. (Примечание: однажды у меня была возможность посидеть с Брэдли Фариасом, который знает это вдоль и поперек, когда он пытался объяснить мне кучу для проекта, над которым он работал, чтобы попытаться визуализировать его. Мой мозг болел .)

Стек

Стек (или стек вызовов) — это место, где происходят все действия, за исключением других мест, где происходят действия. Все, что не может быть выполнено немедленно, удаляется из стека и обрабатывается другим процессом. Это могут быть веб-API, как на картинке, или Node API, например fs или stream. Как только это будет завершено, он будет помещен в очередь (или очередь обратного вызова).

Цикл событий

Здесь все становится интереснее. Очередь начинает помещать элементы в стек только после того, как последний опустеет. Цикл событий — это механизм перемещения этих элементов из очереди в стек. Если процесс занимает много времени, как, например, вызов AJAX, стек может очиститься, и цикл событий может выполниться полностью, опустошив очередь.

Очередь начинает помещать элементы в стек только после того, как последний опустеет. Цикл событий — это механизм перемещения этих элементов из очереди в стек.

Оттуда стек возвращается к делу и обрабатывает все полученные исполнения. Затем процесс начинается снова, с циклом событий и поиском элементов, которые нужно извлечь из очереди и поместить в стек. Теоретически это может происходить до бесконечности, но вероятно этого не произойдет.

Что все это значит?

Какой смысл во всех этих академических экзаменах? Что ж, если понимать, как элементы будут обрабатываться на протяжении всего цикла выполнения JavaScript, то можно избежать самых страшных последствий: блокировки. Мы должны воспользоваться преимуществами асинхронной природы JavaScript и убедиться, что все, что может занять драгоценные миллисекунды в стеке, перетасовывается на рабочий процесс или обратный вызов.

Производительность повышается, процессы становятся более надежными, а экземпляры Node можно масштабировать, чтобы использовать возможности этого способа ведения бизнеса. Есть еще что сказать о потоках (нет, JS на самом деле не однопоточный), но это еще глубже задевает сорняки, и мои ноги уже изранены от кошения этой травы.

Предостережение

Конечно, на практике все это гораздо сложнее. Двигатели, такие как V8, оптимизируют «под капотом» таким образом, что это может изменить этот процесс, хотя разработчик и, следовательно, пользователь никогда не должны знать об этом. В самом браузере может работать несколько таких сред выполнения одновременно. (Вспомните веб-работников.) Тем не менее, эта ментальная модель работает и поможет предотвратить головные боли, такие как ужасное состояние гонки.