Что именно является узлом.JS event loop tick?
Я получаю больше во внутренние части узла.архитектура js, и термин, который я вижу, подходит много,- это "тик", как в "следующем тике цикла событий" или функции nextTick().
то, что я не видел, - это твердое определение того, что именно такое "ТИК". На основе различных статей (такие, как этот), Я был в состоянии собрать концепцию вместе в моей голове, но я не уверен, насколько это точно.
могу ли я получить точную и подробную информацию описание узла.JS event loop tick?
2 ответа:
помните, что в то время как JavaScript является однопоточным, все операции ввода-вывода и вызовы собственных API-интерфейсов являются либо асинхронными (с использованием специфичных для платформы механизмов), либо выполняются в отдельном потоке. (Все это обрабатывается через libuv.)
поэтому, когда есть данные, доступные в сокете или собственной функции API, нам нужен синхронизированный способ вызова функции JavaScript, которая заинтересована в конкретном событии, которое только что произошло.
это не безопасно просто вызовите функцию JS из потока, где собственное событие произошло по тем же причинам, что и в обычном многопоточном приложении-условия гонки, неатомный доступ к памяти и т. д.
Итак, что мы сделать, это поместить событие в очередь в потокобезопасным способом. В упрощенном psuedocode, что-то вроде:
lock (queue) { queue.push(event); }
затем вернемся к основному JavaScript thread (но на стороне C вещей), мы делаем что-то например:
while (true) { // this is the beginning of a tick lock (queue) { var tickEvents = copy(queue); // copy the current queue items into thread-local memory queue.empty(); // ..and empty out the shared queue } for (var i = 0; i < tickEvents.length; i++) { InvokeJSFunction(tickEvents[i]); } // this the end of the tick }
The
while (true)
(который на самом деле не существует в исходном коде узла; это чисто иллюстративно) представляет цикл обработки событий. Внутреннийfor
вызывает функцию JS для каждого события, которое было на очереди.это галочка: синхронный вызов нуля или более функций обратного вызова, связанных с любыми внешними событиями. Как только очередь опустошается и возвращается последняя функция, ТИК заканчивается. Мы возвращаемся к начало (следующая галочка) и проверка событий, которые были добавлены в очередь из других потоков пока наш JavaScript работал.
что можно добавить в очередь?
process.nextTick
setTimeout
/setInterval
- I /O (материал от
fs
,net
и так далее)crypto
процессороемкие функции, такие как криптопотоки, pbkdf2 и PRNG (которые на самом деле являются примером из...)- любые собственные модули, которые используют libuv work queue чтобы синхронные вызовы библиотеки C / C++ выглядели асинхронными
простой ответ для тех, кто новичок в JavaScript:
первое, что нужно понять, это то, что JavaScript-это "однопоточная среда". Это относится к поведению JavaScript при выполнении ваших блоков кода по одному за раз из "цикла событий" в одном потоке. Ниже есть рудиментарная имплементация цикла событий, взятого из книги Кайла Симпсона ydkJS, а затем объяснение:
// `eventLoop` is an array that acts as a queue (first-in, first-out) var eventLoop = [ ]; var event; // keep going "forever" while (true) { // perform a "tick" if (eventLoop.length > 0) { // get the next event in the queue event = eventLoop.shift(); // now, execute the next event try { event(); } catch (err) { reportError(err); } } }
первый цикл while имитирует цикл событий. A галочка-это удаление события из "очереди цикла событий" и выполнение указанного события.
пожалуйста, смотрите ответ "Josh3796" для более подробного объяснения того, что происходит при снятии очереди и выполнении события.
также я рекомендую прочитать книгу Кайла Симпсона для тех, кто заинтересован в получении глубокого понимания JavaScript. Это совершенно бесплатно и с открытым исходным кодом и можно найти по этому адресу ссылка на сайт: https://github.com/getify/You-Dont-Know-JS
конкретный раздел, на который я ссылался, можно найти здесь: https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch1.md#event-loop