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

Модели concurrency в узлах

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

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

4b9b3361

Ответ 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.

Ответ 2

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

Ответ 3

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

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