2016-09-02 2 views
0

Можно ли сказать, что выполнение каждой функции в js является «атомарной операцией» для одиночного потока цикла событий? Я имею в виду, что никакие 2 функции (или больше) могут быть выполнены за один разВыполнение атомарного события цикла javascript событий

ответ

1

Простой ответ, это не так. Подумайте о функциях, переданных setTimeout или XmlHttpRequest.onreadystatechange и т. Д. Эти функции будут выполняться в определенное или неопределенное время в будущем . Если функция уже выполняется при запуске setTimeout или происходит событие изменения состояния готовности, эту функцию не ждет, пока она не завершится до того, как будет выполнена стадия выполнения setTimeout или готового состояния.

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

Первое выполнение функции приостанавливается (после завершения команды и до начала следующего), а инструкции в другой функции выполняются в течение некоторого времени. Затем выполнение этой функции приостанавливается, а один, приостановленный до этого, возобновляется.

1

Javascript использует только одну ветку. Таким образом, в то же время совершенно невозможно, что 2 инструкции запускаются параллельно. Тем не менее, есть очередь событий, которые увольняются, чтобы «прыгать» с одной части кода на другую.

НО

функция использует более 1 инструкции, так что это может произойти, они работают синхронизировано.

+0

«они» - инструкции U meen? –

+0

Я имею в виду функции – Mayday

0

Это правда, javascript предназначен для однопоточного «псевдоасинхронного» сценария на основе событий.

Однако это что-то называется WebWorker, оно создает новый процесс в системе с данным файлом сценария, поэтому он может принимать 2-й поток для вашего приложения. INTRESTED (?) - перенаправление What are the use-cases for Web Workers?

0

Да, функция является атомарными операциями

Чтобы быть более точными, каждая функция является сообщением, которое является частью queue, где каждое сообщение будет переходить к рабочему и казнено к концу.

visualization should be here

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

console.log('foo'); 
 

 
setTimeout(function() { 
 
    console.log('bar'); // This will be called last 
 
}); 
 

 
console.log('baz');

+0

, но если мы заменим 'console.log ('baz');' на 'while (true);' 'bar word 'вообще не будет отображаться –

+0

, потому что его однопоточная. Если вы держите этот единственный поток занятым навсегда, он никогда не перейдет к следующей инструкции. Вот почему вы никогда не используете сон или тяжелые операции не в асинхронной работе в javascript. Вы бы заблокировали GUI – Mayday

+0

@ Vladuysha.Я думаю, что это потому, что 'while (true);' также является атомарной операцией и временем выполнения, ожидающим окончания его выполнения из-за [выполнения до завершения] (https://developer.mozilla.org/en-US/docs/Web/ JavaScript/EventLoop # Run-to-completion). –

Смежные вопросы