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