Многопоточность JavaScript

10

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

Добавьте к этому тот факт, что люди (по крайней мере, некоторые из них) начали переходить в разработке веб-игр с flash на javascript и HTML5.

Не пора ли ему поддерживать многопоточность! Существуют ли браузеры, которые позволяют JavaScript быть многопоточным, или это есть в каких-либо стандартах, HTML5 или будущих версиях?

Али
источник
1
Люди не делают вещи, которые не нужны. Люди, которые внесли свой вклад в дизайн Javascript, также являются теми, кто имеет отношение к разрабатываемым веб-серверам и браузерам, чтобы они знали об этом. Это все о полезности.
Дипан Мехта

Ответы:

9

Многопоточность не будет выполняться в EcmaScript, но может быть доступна в среде хоста.

Классическими примерами являются WebWorkers, которые позволяют вам ускорить работу фонового рабочего и использовать <iframe>его как способ порождения новых процессов.

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

Хотя такие проекты, как webcl , довольно интересны.

Raynos
источник
2
Можете ли вы расширить тот факт, что это "не нужно"? Недавно я натолкнулся на случай, когда естественным случаем в программировании на рабочем столе было бы создание потока для выполнения задачи, но это, очевидно, было нелегким или стандартным вариантом. Я работал над этим делом, но порождение нити казалось более элегантным решением.
Рог
@rig, в каком случае ты пытался разобраться?
Захари К
@Rig привести конкретный пример. вычислительно дорогая обработка редко встречается в клиентском JavaScript
Raynos
@Raynos, пожалуйста, объясните больше о том, как это не нужно, я только думаю, что не уверен, что в разработке игр, например, если будут большие вычисления на графике, а также на физике и логике, частота кадров будет легко затронута, если нет многопоточности, я думаю
Али
@ Али Я остановился и сказал, что есть исключения. Однако большая часть этих тяжелых вычислений должна быть передана графическому процессору через графический интерфейс с аппаратным ускорением
Рэйнос
4

НЕТ

Многопоточность - одна из самых сложных вещей в программном обеспечении. Существует слишком много угловых случаев, которые действительно трудно проработать, когда ваш код не является детерминированным. (Я говорю о многопоточности с блокировками и т. Д.). Кроме того, все различные библиотеки JavaScript построены на предположении, что он не является многопоточным.

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

РЕДАКТИРОВАТЬ: Другая причина заключается в том, что когда JavaScript был создан, он был сделан с предположением, что он будет использоваться для небольших задач, поэтому параллелизм не был встроен. Для его модификации сейчас будет много кода. Добавив веб-работников, можно было создать систему, в которой был бы параллелизм без какой-либо общей памяти, но с использованием акторов - модели параллелизма, которая показала себя очень устойчивой в ряде других языков, таких как Erlang, Scala, Clojure. и т.п.

(Если вы не можете сказать, что я действительно не люблю параллелизм на основе блокировки)

Захари К
источник
1
Multi threading is one of the hardest things in software to get right.- Я просто удивлен этим! Браузер, который вы используете, ОС вашего рабочего стола, веб-сервер, обслуживающий эту страницу - практически каждое приложение, которое вы используете каждый день, является многопоточным. Вы уверены, что это значит? Еще не понизить вас, но я буду, если вы скажетеmultithreading is not done because it is hard
Дипан Мехта
3
Многопоточность @DipanMehta - одна из самых сложных программных задач . Причина, по которой все эти приложения используют его, заключается в том, что они написаны действительно талантливыми людьми
Райнос
@Raynos - боже мой! Так ты называешь меня талантливым! Я использую это каждый день ... я думаю, когда вы программируете на C или в любом крупномасштабном приложении, это довольно часто. Дело в том, что независимо от использования и требований консорциум W3C действительно не пощадил его для Javascript, потому что это было слишком сложно !
Дипан Мехта
2
Вы сильно подчеркиваете, насколько сложно писать правильные и эффективные параллельные программы. Но многопоточность не в JavaScript, потому что это излишняя сложность (вещь была написана за 3 недели)
Raynos
2
@DipanMehta - правильно запрограммированный параллелизм на основе блокировок, и пригвоздить все угловые случаи - трудная проблема. Например, реализация чего-то столь же простого, как очередь с блокировками, которая может быть доказана правильной во всех случаях, была бы общедоступным результатом еще несколько лет назад. Но что более важно, попытка перевести это на язык, на котором его еще нет, вызывает проблемы.
Захари К
3

открытие javascript для многопоточности создаст больше проблем, чем решит:

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

как только вы разрешите вытеснение или параллельное выполнение, эта функция исчезнет, ​​это означает, что вам нужно применить блокировки к данным, которые вы хотите изменить, плюс иметь все сложные условия отладки, чтобы избежать

возможно иметь псевдопараллельное выполнение с использованием тайм-аутов, это означает разделение больших или долго выполняющихся функций на атомарные чанки и использование, setTimeout(function(){nextstep(args);},1);чтобы другие вещи могли запускаться при необходимости

чокнутый урод
источник
0

Некоторое время назад Intel выпустила River Trail , которая позволяет выполнять параллельное программирование на Javascript. Тем не менее, это плагин только для Firefox, и я не слышал о планах по внедрению этой технологии в W3C, а тем более ECMA.

Демиан Брехт
источник