Как Node.js конвертирует ваш код в события?

1

Когда вы сначала запускаете свою программу Node, как/что является первым событием, переданным в цикл событий? Выполняется ли ваша программа как обратный вызов верхнего уровня за все время? (И я бы предположил, что этот обратный вызов верхнего уровня обычно "server.listen()"?)

Теги:
events

2 ответа

2

Я смущен тем, что цикл событий существует за пределами "основного" сценария (или точки входа), который выполняется, или если цикл события запускает сам "основной" скрипт

Оба, на самом деле. Цикл событий - это механизм, который обертывает все выполнение js-кода и не останавливается, пока ожидаются события.

каково первое событие, поданное в цикл событий?

Это оценка основного сценария. (Вернее, код native node.js, который в конечном итоге оценит ваш основной скрипт, - это вещь, которая сначала помещается в цикл событий V8).

Выполняется ли ваша программа как обратный вызов верхнего уровня за все время?

Нет, ничего не выполняется все время, каждый обратный вызов выполняется сам по себе.

0

Я думаю, что этот вопрос основан только на некоторых недоразумениях. Итак, давайте начнем с bascis:

Я как-то думал об узле с точки зрения очереди задач Runnables, что может быть проблемой.

Да. NodeJS не имеет ничего общего с заданием qeue, которое заполняется кодом, который вы поставляете. Qeue заполняется запросами/таймерами и другими вещами. Ваш код просто предоставляет методы для решения таких задач.

Я смущен тем, что цикл событий существует за пределами "основного" сценария (или точки входа), который выполняется, или если цикл события запускает сам "основной" скрипт

Первый. Сначала js разбирается, когда код завершается, начинается цикл события.

//parse + execute the js
while(true){}
//this code never enters the event loop as the global scope js is blocking

как/что является первым событием, переданным в цикл событий?

Мы не знаем. Это может быть таймер, пользовательский запрос, готовый файл и т.д.

Давайте посмотрим на пример кода:

//on start this js is parsed, qeue, heap and the global object are constructed
//a function is stored on the global object
function log(){
 console.log("Hi, im logged");
}

//the function pointer of log is pushed to the qeue
process.nextTick(log);

 //a hardware timer is initialised
setTimeout(log,1000);
//the parser ends, nodejs enters the event loop

Сначала js анализируется. После этого наш глобальный объект содержит журнал функций, а наша задача qeue выглядит так:

qeue=[ log ] //was added trough process.nextTick

В фоновом режиме выполняется таймер аппаратного таймера, который завершится.

Теперь JS-движок входит в цикл событий. Цикл событий обрабатывает qeue. Итак, это похоже на sth, как это (псевдокод):

while(true){    
  execute(qeue.shift())
}

Таким образом, наш журнал вызывается в первый раз, тогда наш qeue пуст, и цикл события останавливается/выполняет некоторые фоновые задачи.

Через одну секунду таймер заканчивает и толкает журнал на qeue:

function timer_finishes(){
  qeue.push(log);
}

Итак, теперь наш qeue содержит другую функцию для выполнения.

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

  • 0
    О, это имеет смысл, спасибо! Я думал, что он просто блокирует что-то вроде «server.listen ()» в основном скрипте, и что Node завершается после достижения конца скрипта.
  • 0
    @ Данила Шутов, это вопрос определения. Если nodejs использует libuv для планирования цикла событий, я думаю, что можно сказать, что nodejs имеет цикл событий.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню