Подтвердить что ты не робот

Что именно представляет собой цикл цикла событий Node.js?

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

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

Могу ли я получить точное и подробное описание галочки цикла событий Node.js?

4b9b3361

Ответ 1

Помните, что, хотя JavaScript является однопоточным, все операции ввода/вывода node и вызовы для собственных API-интерфейсов являются либо асинхронными (с использованием механизмов, специфичных для платформы), либо выполняются в отдельном потоке. (Все это обрабатывается через libuv.)

Поэтому, когда возвращаемые данные, доступные в сокете или встроенной функции API, нам нужен синхронизированный способ вызвать функцию JavaScript, которая интересуется конкретным событием, которое только что произошло.

Небезопасно просто вызвать функцию JS из потока, в котором произошло родное событие по тем же причинам, с которыми вы столкнулись в регулярном многопоточном приложении – условия гонки, неатомный доступ к памяти и т.д.

Итак, что мы делаем, помещаем событие в очередь поточно-безопасным способом. В упрощенном psuedocode что-то вроде:

lock (queue) {
    queue.push(event);
}

Затем, вернемся к основному потоку JavaScript (но на стороне 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
}

while (true) (который фактически не существует в исходном коде node, это просто иллюстративно) представляет цикл событий. Внутренний for вызывает функцию JS для каждого события, которое находилось в очереди.

Это галочка: синхронный вызов нулевой или более функций обратного вызова, связанных с любыми внешними событиями. Как только очередь будет опустошена и последняя функция вернется, галочка завершена. Мы возвращаемся к началу (следующий тик) и проверяем события, которые были добавлены в очередь из других потоков во время работы нашего JavaScript.

Что может добавить вещи в очередь?

  • process.nextTick
  • setTimeout/<Т26 >
  • I/O (материал от fs, net и т.д.)
  • crypto Процессорные функции, такие как криптопотоки, pbkdf2 и PRNG (которые на самом деле являются примером...)
  • любые встроенные модули, которые используют рабочую очередь libuv, чтобы синхронные вызовы библиотеки C/С++ выглядели асинхронными

Ответ 2

Более простой ответ для новичков в 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 имитирует цикл событий. Тик - это удаление события из "очереди цикла событий" и выполнение указанного события.

Пожалуйста, смотрите ответ "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

Ответ 3

Очень простой и короткий способ галочки Event Loop:

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