Если ли хоть какой-то параллелизм в javascript? Хотя наверное правильней говорить не о яваскрипте, а об интепретаторе. Я не профессионал в нем, но вот начали возникать вопросы: а может ли функция обработчик какого-то события (щелчка мыши к примеру) или функция запущенная асинхронно через setTimeout испортить какой-либо объект, во время того как с этим объектом работает другая функция? Типа
// Где-то происходит проверка
if (a != null)
a.doSmth()
// А в обработчике события или в функции запускаемой асинхронно
a = null
// Может ли произойти ошибка из-за того что во время проверки a будет != null, а в момент вызова метода a уже будет null?
Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Здравствуйте, Sorc17, Вы писали:
S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.
Нет, не прерывается. Браузер не запустит следующий обработчник, если работющий не закончил работу.
Здравствуйте, Sorc17, Вы писали:
S>Если ли хоть какой-то параллелизм в javascript? S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.
А что говорит об этом Священный Стандарт ECMA-262? Казалось бы, скачать и поискать по нему слова concurren*, thread, synchron*.
Здравствуйте, Sorc17, Вы писали:
S>Если ли хоть какой-то параллелизм в javascript? Хотя наверное правильней говорить не о яваскрипте, а об интепретаторе. Я не профессионал в нем, но вот начали возникать вопросы: а может ли функция обработчик какого-то события (щелчка мыши к примеру) или функция запущенная асинхронно через setTimeout испортить какой-либо объект, во время того как с этим объектом работает другая функция? Типа
Если речь о браузерах — то исключительно весь код выполняется в одном потоке, т.е. никакого параллелизма нет. Асинхронность же сама по себе ещё не означает параллельность.
PS: Насколько я знаю, единственный способ, выполнить что-то параллельно — это использовать WebWorkers (только современенные браузеры).
Здравствуйте, fddima, Вы писали:
F> Если речь о браузерах — то исключительно весь код выполняется в одном потоке, т.е. никакого параллелизма нет. Асинхронность же сама по себе ещё не означает параллельность.
Интересно получается, что даже пока не отработает код написанный просто между тегами <script> не будут выполнятся ни какие события. По крайней мере у меня не получилось сделать так while(i++ < 1000000) между <script> повесил браузер и обработчики событий разу не сработали как я не тыкался в страницу пока не отработал этот цикл. Интересно что является единицей выполнения (которую нельзя прервать) для интерпретатора яваскрипта.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
S>Не знаю куда написать поэтому пишу сюда
S>Если ли хоть какой-то параллелизм в javascript? Хотя наверное правильней говорить не о яваскрипте, а об интепретаторе. Я не профессионал в нем, но вот начали возникать вопросы: а может ли функция обработчик какого-то события (щелчка мыши к примеру) или функция запущенная асинхронно через setTimeout испортить какой-либо объект, во время того как с этим объектом работает другая функция? Типа
S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.
Да, это так, параллелизма нет. Есть WebWorkers API, но пока ещё нет поддержки браузерами. В Gears, кажется, были потоки, но он заглох.
Здравствуйте, Sorc17, Вы писали:
S>Интересно получается, что даже пока не отработает код написанный просто между тегами <script> не будут выполнятся ни какие события. По крайней мере у меня не получилось сделать так while(i++ < 1000000) между <script> повесил браузер и обработчики событий разу не сработали как я не тыкался в страницу пока не отработал этот цикл. Интересно что является единицей выполнения (которую нельзя прервать) для интерпретатора яваскрипта.
Единицией выполнения и есть скрипт или функция. Думаю что в большинстве браузеров (а в Chromium так оно и есть) — внутри браузера есть UI thread и message loop (он может быть отделён от системного, а может быть и интегрирован) — вот выполнение скриптов происходит в этом потоке, и фактически для того, что бы выполнить произвольный скрипт — необходимо сделать post message (setTimeout практически это и делает). Соответственно пока выполняется скрипт — нет никаких шансов обработать другие события.
Здравствуйте, fddima, Вы писали:
F> Единицией выполнения и есть скрипт или функция. Думаю что в большинстве браузеров (а в Chromium так оно и есть) — внутри браузера есть UI thread и message loop (он может быть отделён от системного, а может быть и интегрирован) — вот выполнение скриптов происходит в этом потоке, и фактически для того, что бы выполнить произвольный скрипт — необходимо сделать post message (setTimeout практически это и делает). Соответственно пока выполняется скрипт — нет никаких шансов обработать другие события.
Спасибо Теперь я спокоен
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Здравствуйте, Sorc17, Вы писали:
S>Если ли хоть какой-то параллелизм в javascript? Хотя наверное правильней говорить не о яваскрипте, а об интепретаторе. Я не профессионал в нем, но вот начали возникать вопросы: а может ли функция обработчик какого-то события (щелчка мыши к примеру) или функция запущенная асинхронно через setTimeout испортить какой-либо объект, во время того как с этим объектом работает другая функция? Типа S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма. Когда срабатывает обработчик события выполнение другого кода прерывается, выполняется обработчик события, а затем другой код продолжает работать. Так ли это? Потестить не получилось.
Нету паралелизма в javaScript. Все работает в одном потоке — никаких прерываний и никакой порчи объектов.
Даже в node.js — серверной реализации никак не могут распаралелить))
JavaScript как язык и multi-threading есть ортогональные понятия.
Точно так же как и например С или С++.
Если же говорить про runtime то JavaScript VM может быть исполнена с поддержкой threads.
Во всяком случае у меня есть имплементация практически полной JS VM в которой можно запускать функции в разных потоках.
Делал такой эксперимент.
Но это в общем-то никому не нужно по другим объективным причинам.
HTML/CSS как весь остальной UI есть inherently single threaded — требуется наличие так называемой GUI thread.
Во всяком случае "one thread — one html document" принцип сильно упрощает жизнь да и увеличивает общую скорость работы browser.
Поэтому и скрипты тоже никто не заморачивается делать многопоточными.
Здравствуйте, fddima, Вы писали:
F>Здравствуйте, Sorc17, Вы писали:
S>>Интересно получается, что даже пока не отработает код написанный просто между тегами <script> не будут выполнятся ни какие события. По крайней мере у меня не получилось сделать так while(i++ < 1000000) между <script> повесил браузер и обработчики событий разу не сработали как я не тыкался в страницу пока не отработал этот цикл. Интересно что является единицей выполнения (которую нельзя прервать) для интерпретатора яваскрипта. F> Единицией выполнения и есть скрипт или функция. Думаю что в большинстве браузеров (а в Chromium так оно и есть) — внутри браузера есть UI thread и message loop (он может быть отделён от системного, а может быть и интегрирован) — вот выполнение скриптов происходит в этом потоке, и фактически для того, что бы выполнить произвольный скрипт — необходимо сделать post message (setTimeout практически это и делает). Соответственно пока выполняется скрипт — нет никаких шансов обработать другие события.
Безотносительно к обработке скриптов отмечу, что при любой обработке чего бы то ни было в Win API возможность "отвлечься" и выполнить обработку другого сообщения есть — конечно, если программист это предусмотрел.
Здравствуйте, Sorc17, Вы писали:
S>Если ли хоть какой-то параллелизм в javascript? S>Складывается ощущение, что в javascript вообще нет ни какого параллелизма.
Для JavaScript, так же, как, например, для С/C++ — параллелизм есть не в языке, и не "в интерпретаторе". Он есть в API, которое является окружением "интерпретатора".
Если речь идет о браузере (а, скажем, не о node.js, скриптинге Qt, или других местах, где встречается JavaScript), то таким API в окружении браузера является HTML 5 Web Workers API. Гугли.
Опять, кстати, возникла проблема из-за отсутствия сабжа. Захотелось мне сделать такую функцию, которая динамически подгружает скрипт с сервера, тут же выполняет его, что-то делает с данными, которые этот скрипт в себе нёс, а потом возвращает управление. Оказалось это невозможно и нужно городить всякие аяксы@evalы. Защито???7 Ну или не аяксы@эвалы, а какую-нибудь асинхронную баланду придумать, чтобы было не важно, когда выполнится динамически подгруженный скрипт.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Здравствуйте, Sorc17, Вы писали:
S>Опять, кстати, возникла проблема из-за отсутствия сабжа. Захотелось мне сделать такую функцию, которая динамически подгружает скрипт с сервера, тут же выполняет его, что-то делает с данными, которые этот скрипт в себе нёс, а потом возвращает управление. Оказалось это невозможно и нужно городить всякие аяксы@evalы. Защито???7 Ну или не аяксы@эвалы, а какую-нибудь асинхронную баланду придумать, чтобы было не важно, когда выполнится динамически подгруженный скрипт.