Что именно является узлом.JS event loop tick?


Я получаю больше во внутренние части узла.архитектура js, и термин, который я вижу, подходит много,- это "тик", как в "следующем тике цикла событий" или функции nextTick().

то, что я не видел, - это твердое определение того, что именно такое "ТИК". На основе различных статей (такие, как этот), Я был в состоянии собрать концепцию вместе в моей голове, но я не уверен, насколько это точно.

могу ли я получить точную и подробную информацию описание узла.JS event loop tick?

2 54

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