javascript - проблемы, связанные с событиями и параллелизмом?

Привет,

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

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

var bigObject = new BigObject();

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

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

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

Я что-то упускаю?


person Daniel    schedule 17.11.2010    source источник


Ответы (4)


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

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

person Amnon    schedule 17.11.2010
comment
srrraatchhhhh звук переключения передач в моей голове! Я понимаю, но мне нужно еще немного посредничать в этом. - person Daniel; 19.11.2010
comment
Лучший способ понять это — использовать — написать несколько небольших программ на node.js. - person Amnon; 19.11.2010
comment
@ Даниэль, ты имел в виду медитировать? :) Кроме того, я думаю, что только что услышал те же самые звуки в своей голове. Сколько раз переключаться между языками и платформами, пока мой мозг не развалится? - person snapfractalpop; 22.03.2012

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

person Jacob Mattison    schedule 17.11.2010

Существует только один поток; см.: Node.js на многоядерных компьютерах

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

person Justin Ethier    schedule 17.11.2010
comment
На самом деле это дизайнерское решение: процессы являются фундаментальной единицей node.js. В любом случае, JavaScript — это событийный язык, поэтому потоки не имеют смысла. - person xj9; 19.11.2010

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

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

Дополнительную информацию см. в разделе Почему в javascript нет инструмента управления параллелизмом. Детали.

person Uzair Farooq    schedule 17.07.2015