Параллелизм javascript
От: Sorc17 Россия  
Дата: 15.08.11 06:58
Оценка:
Не знаю куда написать поэтому пишу сюда

Если ли хоть какой-то параллелизм в javascript? Хотя наверное правильней говорить не о яваскрипте, а об интепретаторе. Я не профессионал в нем, но вот начали возникать вопросы: а может ли функция обработчик какого-то события (щелчка мыши к примеру) или функция запущенная асинхронно через setTimeout испортить какой-либо объект, во время того как с этим объектом работает другая функция? Типа

    // Где-то происходит проверка
    if (a != null)
        a.doSmth()

    // А в обработчике события или в функции запускаемой асинхронно
    a = null

    // Может ли произойти ошибка из-за того что во время проверки a будет != null, а в момент вызова метода a уже будет null?

Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re: Параллелизм javascript
От: Lloyd Россия  
Дата: 15.08.11 07:10
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.


Нет, не прерывается. Браузер не запустит следующий обработчник, если работющий не закончил работу.
Re: Параллелизм javascript
От: Centaur Россия  
Дата: 15.08.11 07:11
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>Если ли хоть какой-то параллелизм в javascript?

S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.

А что говорит об этом Священный Стандарт ECMA-262? Казалось бы, скачать и поискать по нему слова concurren*, thread, synchron*.
Re[2]: Параллелизм javascript
От: Sorc17 Россия  
Дата: 15.08.11 07:15
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Нет, не прерывается. Браузер не запустит следующий обработчник, если работющий не закончил работу.


Да, и правда обработчик было бы неправильно прерывать.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re: Параллелизм javascript
От: fddima  
Дата: 15.08.11 07:22
Оценка: +2
Здравствуйте, Sorc17, Вы писали:

S>Если ли хоть какой-то параллелизм в javascript? Хотя наверное правильней говорить не о яваскрипте, а об интепретаторе. Я не профессионал в нем, но вот начали возникать вопросы: а может ли функция обработчик какого-то события (щелчка мыши к примеру) или функция запущенная асинхронно через setTimeout испортить какой-либо объект, во время того как с этим объектом работает другая функция? Типа

Если речь о браузерах — то исключительно весь код выполняется в одном потоке, т.е. никакого параллелизма нет. Асинхронность же сама по себе ещё не означает параллельность.

PS: Насколько я знаю, единственный способ, выполнить что-то параллельно — это использовать WebWorkers (только современенные браузеры).
Re[2]: Параллелизм javascript
От: Sorc17 Россия  
Дата: 15.08.11 07:29
Оценка:
Здравствуйте, fddima, Вы писали:

F> Если речь о браузерах — то исключительно весь код выполняется в одном потоке, т.е. никакого параллелизма нет. Асинхронность же сама по себе ещё не означает параллельность.


Интересно получается, что даже пока не отработает код написанный просто между тегами <script> не будут выполнятся ни какие события. По крайней мере у меня не получилось сделать так while(i++ < 1000000) между <script> повесил браузер и обработчики событий разу не сработали как я не тыкался в страницу пока не отработал этот цикл. Интересно что является единицей выполнения (которую нельзя прервать) для интерпретатора яваскрипта.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re: Параллелизм javascript
От: Temoto  
Дата: 15.08.11 07:35
Оценка:
S>Не знаю куда написать поэтому пишу сюда

S>Если ли хоть какой-то параллелизм в javascript? Хотя наверное правильней говорить не о яваскрипте, а об интепретаторе. Я не профессионал в нем, но вот начали возникать вопросы: а может ли функция обработчик какого-то события (щелчка мыши к примеру) или функция запущенная асинхронно через setTimeout испортить какой-либо объект, во время того как с этим объектом работает другая функция? Типа


S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.


Да, это так, параллелизма нет. Есть WebWorkers API, но пока ещё нет поддержки браузерами. В Gears, кажется, были потоки, но он заглох.
Re[3]: Параллелизм javascript
От: fddima  
Дата: 15.08.11 08:08
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>Интересно получается, что даже пока не отработает код написанный просто между тегами <script> не будут выполнятся ни какие события. По крайней мере у меня не получилось сделать так while(i++ < 1000000) между <script> повесил браузер и обработчики событий разу не сработали как я не тыкался в страницу пока не отработал этот цикл. Интересно что является единицей выполнения (которую нельзя прервать) для интерпретатора яваскрипта.

Единицией выполнения и есть скрипт или функция. Думаю что в большинстве браузеров (а в Chromium так оно и есть) — внутри браузера есть UI thread и message loop (он может быть отделён от системного, а может быть и интегрирован) — вот выполнение скриптов происходит в этом потоке, и фактически для того, что бы выполнить произвольный скрипт — необходимо сделать post message (setTimeout практически это и делает). Соответственно пока выполняется скрипт — нет никаких шансов обработать другие события.
Re[4]: Параллелизм javascript
От: Sorc17 Россия  
Дата: 15.08.11 14:30
Оценка:
Здравствуйте, fddima, Вы писали:

F> Единицией выполнения и есть скрипт или функция. Думаю что в большинстве браузеров (а в Chromium так оно и есть) — внутри браузера есть UI thread и message loop (он может быть отделён от системного, а может быть и интегрирован) — вот выполнение скриптов происходит в этом потоке, и фактически для того, что бы выполнить произвольный скрипт — необходимо сделать post message (setTimeout практически это и делает). Соответственно пока выполняется скрипт — нет никаких шансов обработать другие события.


Спасибо Теперь я спокоен
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re: Параллелизм javascript
От: 11molniev  
Дата: 15.08.11 15:39
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>Если ли хоть какой-то параллелизм в javascript? Хотя наверное правильней говорить не о яваскрипте, а об интепретаторе. Я не профессионал в нем, но вот начали возникать вопросы: а может ли функция обработчик какого-то события (щелчка мыши к примеру) или функция запущенная асинхронно через setTimeout испортить какой-либо объект, во время того как с этим объектом работает другая функция? Типа

S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.

Нету паралелизма в javaScript. Все работает в одном потоке — никаких прерываний и никакой порчи объектов.
Даже в node.js — серверной реализации никак не могут распаралелить))
Re: Параллелизм javascript
От: c-smile Канада http://terrainformatica.com
Дата: 17.08.11 16:17
Оценка: 2 (1)
Здравствуйте, Sorc17, Вы писали:

JavaScript как язык и multi-threading есть ортогональные понятия.
Точно так же как и например С или С++.

Если же говорить про runtime то JavaScript VM может быть исполнена с поддержкой threads.
Во всяком случае у меня есть имплементация практически полной JS VM в которой можно запускать функции в разных потоках.
Делал такой эксперимент.

Но это в общем-то никому не нужно по другим объективным причинам.
HTML/CSS как весь остальной UI есть inherently single threaded — требуется наличие так называемой GUI thread.
Во всяком случае "one thread — one html document" принцип сильно упрощает жизнь да и увеличивает общую скорость работы browser.
Поэтому и скрипты тоже никто не заморачивается делать многопоточными.
Re[4]: Параллелизм javascript
От: Pavel Dvorkin Россия  
Дата: 18.08.11 08:20
Оценка: 1 (1)
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, Sorc17, Вы писали:


S>>Интересно получается, что даже пока не отработает код написанный просто между тегами <script> не будут выполнятся ни какие события. По крайней мере у меня не получилось сделать так while(i++ < 1000000) между <script> повесил браузер и обработчики событий разу не сработали как я не тыкался в страницу пока не отработал этот цикл. Интересно что является единицей выполнения (которую нельзя прервать) для интерпретатора яваскрипта.

F> Единицией выполнения и есть скрипт или функция. Думаю что в большинстве браузеров (а в Chromium так оно и есть) — внутри браузера есть UI thread и message loop (он может быть отделён от системного, а может быть и интегрирован) — вот выполнение скриптов происходит в этом потоке, и фактически для того, что бы выполнить произвольный скрипт — необходимо сделать post message (setTimeout практически это и делает). Соответственно пока выполняется скрипт — нет никаких шансов обработать другие события.

Безотносительно к обработке скриптов отмечу, что при любой обработке чего бы то ни было в Win API возможность "отвлечься" и выполнить обработку другого сообщения есть — конечно, если программист это предусмотрел.
With best regards
Pavel Dvorkin
Re: Параллелизм javascript
От: Gaperton http://gaperton.livejournal.com
Дата: 26.08.11 10:25
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>Если ли хоть какой-то параллелизм в javascript?

S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма.

Для JavaScript, так же, как, например, для С/C++ — параллелизм есть не в языке, и не "в интерпретаторе". Он есть в API, которое является окружением "интерпретатора".

Если речь идет о браузере (а, скажем, не о node.js, скриптинге Qt, или других местах, где встречается JavaScript), то таким API в окружении браузера является HTML 5 Web Workers API. Гугли.
Re[2]: Параллелизм javascript
От: Gaperton http://gaperton.livejournal.com
Дата: 26.08.11 10:56
Оценка:
Здравствуйте, Temoto, Вы писали:

T> Есть WebWorkers API, но пока ещё нет поддержки браузерами.


Уже есть поддержка всеми основными браузерами.
Re: Параллелизм javascript
От: Sorc17 Россия  
Дата: 30.08.11 08:50
Оценка:
Опять, кстати, возникла проблема из-за отсутствия сабжа. Захотелось мне сделать такую функцию, которая динамически подгружает скрипт с сервера, тут же выполняет его, что-то делает с данными, которые этот скрипт в себе нёс, а потом возвращает управление. Оказалось это невозможно и нужно городить всякие аяксы@evalы. Защито???7 Ну или не аяксы@эвалы, а какую-нибудь асинхронную баланду придумать, чтобы было не важно, когда выполнится динамически подгруженный скрипт.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[2]: Параллелизм javascript
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 30.08.11 09:48
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>Опять, кстати, возникла проблема из-за отсутствия сабжа. Захотелось мне сделать такую функцию, которая динамически подгружает скрипт с сервера, тут же выполняет его, что-то делает с данными, которые этот скрипт в себе нёс, а потом возвращает управление. Оказалось это невозможно и нужно городить всякие аяксы@evalы. Защито???7 Ну или не аяксы@эвалы, а какую-нибудь асинхронную баланду придумать, чтобы было не важно, когда выполнится динамически подгруженный скрипт.


Зато дедлоков нету.
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[3]: Параллелизм javascript
От: Sorc17 Россия  
Дата: 30.08.11 10:05
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Зато дедлоков нету.


Ну да, всегда знаешь что тебе никакой поток нигде ничего не напортит.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.