Я написал статью раньшеУглубленный анализ рабочего механизма Js, в основном говоря о механизме цикла событий (Event Loop) Js. С текущей точки зрения, он не может быть неправильным, но это абсолютно не так."глубокий"(Кто еще не был молод), в сегодняшнюю эпоху Js с несколькими хостами необходимо стоять на более высоком угле, чтобы сражаться слева и справа.
1. Возврат хоста к возврату хоста Js
Под хостом здесь понимается рабочая среда js. В настоящее время основная рабочая среда js включает браузер, Node и RN/Weex.
Углубленный анализ рабочего механизма JsОписание механизма цикла обработки событий в этой статье в целом понятно, но оно не исключает части самого Js и хоста. До этого наше обсуждение Js было в основном основано на браузерах (по умолчанию), и кажется, что это не будет иметь никакого эффекта, если мы не разделим его.Сегодня, если мы хотим расширить наши возможности Js на бэкэнд Node и RN /Weex, раздевая Treating, даст вам ощущение зрения, что все под контролем
Возьмите сравнение основных компонентов каждой хост-среды в качестве отправной точки.
В двух моих последних статьях упоминалось (возможно, более подробно) сравнение трех хостинговых сред, которое можно резюмировать с точки зрения этой статьи следующим образом:
Несколько хостов включают механизм javascript для выполнения js, среди которых v8 является наиболее широко используемым, и все считывают ввод-вывод через промежуточный уровень, а также включают механизм рендеринга интерфейса во внешнем интерфейсе (браузер/RN/Weex)
То есть базовые языковые возможности Js в основном поддерживаются движком Js (v8/javascriptCore и т. д.), например, базовые синтаксисы, такие как массивы, функции, объекты и т. д., а также чтение и запись операций ввода-вывода, рендеринг интерфейса. API, все они относятся к расширению хоста, благодаря единой координации и планированию хоста.
Например, в браузере Js может вызывать Dom Api для управления Html Dom, тем самым влияя на дерево рендеринга.На самом деле это API, расширенный браузером до Js, и через промежуточный уровень для координации движка Js и ядра рендеринга. Связь; объект окна браузера такой, его расположение, история и другие интерфейсы — все это расширения хоста, чтобы позволить Js манипулировать поведением оболочки браузера.Вы должны знать, что в Node нет Dom API и оконные объекты, т.к. Node как серверный хост вообще не имеет движка рендеринга интерфейса.
Для связи между хост-оболочкой и движком Js, на примере Node, среда Node написана на c/c++, и в нее встроен движок Js v8 (конечно, v8 тоже написан на c/c++) , Весь коммуникационный процесс, это процесс вызова C++ v8. Чтобы поддерживать асинхронное чтение и запись Js, хост также создаст для него цикл событий и пул потоков, которые будут обсуждаться позже.
2. IO чтение и запись
Компьютер можно разделить на вычислительный блок (ЦП) и блок ввода-вывода (IO).Будь то браузер, узел или RN/Weex, необходимо запланировать использование ЦП и ввода-вывода, чтобы максимизировать производительность. Если внешние компоненты рендеринга используются для чтения и записи на графическую карту,Тогда разница между каждым хостом может быть фактически абстрагирована от поддержки возможностей ввода-вывода.
Возможности чтения и записи ввода-вывода Js зависят от расширения песочницы хостом.Браузер расширяет Dom Api, чтобы позволить Js легко управлять компонентами рендеринга, но с точки зрения чтения и записи на диск Node намного удобнее, чем Браузер; Node может управлять сетевой картой для открытия Http-сервера, но браузер не предоставляет такой возможности. На самом деле не так уж и сложно
Разница между каждым хостом в основном отражается в расширении возможностей чтения и записи ввода-вывода.
Будь то заблокированный ввод-вывод или неблокирующий ввод-вывод, существует процесс ожидания потока, а ожидание каждой секунды является большой тратой ресурсов ЦП, поэтому почти все старшие языки читаются на вводе-выводе, создав выделенный поток прослушивания. для ожидания чтения IO. Однако вы, должно быть, слышали, что JS — это однопоточный язык, но его асинхронный механизм очень хорош для решения процесса ожидания чтения WOO. На самом деле, эта однопоточность заключается в том, что JS имеет уникальный пользовательский поток, то есть код JS, брошенный в V8, является одним потоком, а хост-среда позволяет JS считывать процесс ввода-вывода. процессоров, создает пул потоков, используя механизм цикла событий для поддержки асинхронных возможностей JS, на данный момент все хосты совпадают с return ~~
В-третьих, для достижения асинхронного механизма
существуетУглубленный анализ рабочего механизма JsАналогичная картина была нарисована и в той статье, только здесь внесены небольшие изменения, а пул потоков и часть движка Js обведены кружком (о содержании цикла событий может быть более подробно введение в предыдущей статье, можно обратиться)
Обычно то, что мы называем Js, является однопоточным, что означает, что он имеет только один уникальный поток выполнения (пользовательский поток), который является частью движка Js в правом нижнем углу рисунка выше, но с точки зрения всего хосту необходимо поддерживать пул потоков. , для каждого асинхронного вызова ввода-вывода в пуле потоков будет найден доступный поток для мониторинга и ожидания чтения ввода-вывода, а после завершения чтения ввода-вывода будет запущена функция обратного вызова. помещается в цикл событий, и поток выполнения Js будет всплывать каждый раз, когда функция обратного вызова и ееконтекст выполненияИсполнение
В частности, в дополнение к асинхронному чтению IO, функции синхронизации (такие как setTimeout) также являются асинхронными.Необходимо использовать поток синхронизации для своевременного помещения обратного вызова в цикл событий.После завершения потока выполнения Js текущая задача, событие всплывает и выполняется в цикле, поэтому setTimeout иногда не обязательно так пунктуален
4. Резюме
Технически, если слишком ограничивать себя, и рисовать землю как тюрьму, у вас всегда будет ощущение, что вы находитесь только в этой горе. более подробно~~
Передняя часть FIMcЭто сообщество знаний, которое углубляет знания в принципы. У нас есть планета знаний, официальный аккаунт и группа. Добро пожаловать, чтобы добавить микрокрючки: facemagic2014