Полезно понять, как взаимодействуют узел и V8.Узел обрабатывает ожидание ввода-вывода или таймеров от операционной системы.Когда узел просыпается от ввода-вывода или таймера, он обычно имеет несколько обратных вызовов JavaScript для вызова.Когда узел выполняет эти обратные вызовы, управление передается в V8 до тех пор, пока V8 не вернется обратно к узлу.
Итак, если вы выполните var ii = 1; ii++;
, вы никогда не обнаружите, что ii - это что-то отличное от 2. Все JavaScript работает до завершения, а затем управление передается обратно на узел.Если вы делаете doSomething(); doSomething();
, это всегда будет запускать doSomething дважды, и он не вернется в цикл обработки событий узла, пока не будет возвращен второй вызов doSomething.Это означает, что вы можете полностью заблокировать узел из-за простой ошибки, подобной этой:
for (var i=0 ; i >= 0 ; i++) {}
Не имеет значения, сколько обратных вызовов ввода / вывода вы зарегистрировали, таймеры установлены на отключение или сокеты, ожидающие получениячитать.Пока V8 не вернется из этого бесконечного цикла, узел больше не работает.
Это часть того, что делает программирование в узле таким приятным.Вам никогда не придется беспокоиться о блокировке.Здесь нет условий гонки или критических участков.Существует только один поток, в котором выполняется ваш код JavaScript.