javascript - управляемые событиями и проблемы параллелизма? - PullRequest
8 голосов
/ 18 ноября 2010

Привет,

Я изучаю javascript, nodejs.И я не понимаю, как избежать проблем параллелизма в javascript.

Допустим, я работаю над объектом

var bigObject = new BigObject();

, и у меня есть setTimer(function(){ workOnBigOjbect...} ), который также будет делатьработать на bigOjbect.

Если у меня дисковый ввод-вывод, записываемый в bigObject, и объект таймера, работающий на bigObject, и регулярное чтение кода из bigObject, как избежать проблем параллелизма?

На обычном языке я бы использовал мьютекс или потокобезопасный шаблон очереди / команды.Я также не вижу много дискуссий об условиях гонки для javascript.

Я что-то упустил?

Ответы [ 4 ]

9 голосов
/ 18 ноября 2010

Суть node.js в том, что он управляется событиями. Весь код выполняется в обработчиках событий в одном потоке. Нет проблем с параллелизмом, потому что код не запускается одновременно. Недостатком является то, что каждый обработчик события должен быстро завершиться, потому что он блокирует другие события.

В вашем примере код запустит дисковый ввод-вывод и немедленно завершится. Инфраструктура node.js уведомит программу о том, что операция ввода-вывода была завершена путем запуска обработчика событий. Событие таймера будет вызываться до или после события ввода-вывода, но никогда одновременно.

3 голосов
/ 18 ноября 2010

Javascript является однопоточным.Если наступает время, когда ваша функция должна выполняться (в зависимости от того, как вы вызвали setTimer), и родительский код все еще выполняется, функция не будет выполняться, пока родительский код не завершится.

2 голосов
/ 18 ноября 2010

Есть только одна нить;см .: Node.js на многоядерных машинах

Я бы предположил, что это потому, что несколько потоков не поддерживаются в базовом движке JavaScript V8, поскольку обычно JavaScript выполняется в браузере (где вВ случае с Windows существует только один поток пользовательского интерфейса), и он не поддерживает несколько потоков.

1 голос
/ 17 июля 2015

В javascript есть такая вещь, как Run-to-Completion , которая гарантирует, что если код выполняется, он выполняется полностью до запуска любого другого (асинхронного) кода, следовательно, нет проблем параллелизма.

В случае вашего примера, когда вызывается обратный вызов таймера, он выполняется полностью и никогда не будет прерван в середине для выполнения какого-либо другого кода.

См. Почему нет управления параллелизмоминструмент в javascript для более подробной информации.

...