Модели параллелизма в nodejs - PullRequest
28 голосов
/ 01 марта 2011

Кто-нибудь знает, какие модели памяти и потоков используются в nodejs?

В частности, ii++ является атомным? Он ведет себя так, как если бы ii были volatile в Java 1.5, в Java 1.4, в C или нет вообще?

Ответы [ 3 ]

39 голосов
/ 03 марта 2011

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

Итак, если вы выполните var ii = 1; ii++;, вы никогда не обнаружите, что ii - это что-то отличное от 2. Все JavaScript работает до завершения, а затем управление передается обратно на узел.Если вы делаете doSomething(); doSomething();, это всегда будет запускать doSomething дважды, и он не вернется в цикл обработки событий узла, пока не будет возвращен второй вызов doSomething.Это означает, что вы можете полностью заблокировать узел из-за простой ошибки, подобной этой:

for (var i=0 ; i >= 0 ; i++) {}

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

Это часть того, что делает программирование в узле таким приятным.Вам никогда не придется беспокоиться о блокировке.Здесь нет условий гонки или критических участков.Существует только один поток, в котором выполняется ваш код JavaScript.

13 голосов
/ 01 марта 2011

Существует только один поток (цикл обработки событий), и ваш код никогда не прерывается, если вы не выполните асинхронное действие, такое как ввод / вывод.Вы не можете выполнять параллельное выполнение кода.Следовательно, ii ++ является атомарным .

4 голосов
/ 03 марта 2011

Хорошая статья, которая объясняет, что является и не является асинхронным в файле node.js: Понимание цикла события node.js .Если вы понимаете, что сможете определить, где ваше приложение выполняет асинхронное поведение, а где - нет.Понимая это, вы можете явно писать последовательный код, когда вам это нужно.EventEmitters являются ключевыми.

Singlethreadedness звучит вразрез с идеей, что node.js является высокопроизводительным и масштабируемым, поэтому посмотрите на эту статью от Yahoo по Multicore .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...