Вопрос

Привет,

Я изучал JavaScript, Nodejs. И я не понимаю, как проблемы параллелизма избегают в JavaScript.

Позвольте сказать, что я работаю над объектом

var bigObject = new BigObject();

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

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

На регулярном языке я бы использовал Mutex или Food-Safe Oneue / Command Pattern. Я также не вижу много обсуждений о состоянии гонки для JavaScript.

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Есть эта вещь в JavaScript называется Заканчивать Что гарантирует, что если код выполняется, его выполняется, прежде чем любой другой (асинхронный) код работает, следовательно, нет проблем параллелизма.

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

Видеть Почему нет инструмента управления параллелизма в JavaScript Больше подробностей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top