16 ответов:
JavaScript не поддерживает многопоточность, потому что интерпретатор JavaScript в браузере является одним потоком (AFAIK). Даже Google Chrome не позволит JavaScript одной веб-страницы работать одновременно, потому что это приведет к массовым проблемам параллелизма в существующих веб-страницах. Все, что делает Chrome, - это разделение нескольких компонентов (разных вкладок, плагинов и т. д.) на отдельные процессы, но я не могу представить, что одна страница имеет более одного потока JavaScript.
Вы можете однако использовать, как было предложено,
setTimeoutчтобы разрешить какое-то планирование и "поддельный" параллелизм. Это приводит к тому, что браузер восстанавливает контроль над потоком рендеринга и запускает код JavaScript, предоставленныйsetTimeoutчерез заданное количество миллисекунд. Это очень полезно, если вы хотите, чтобы видовой экран (то, что вы видите), чтобы обновить при выполнении операций на нем. Просто зацикливание, например, координат и соответствующее обновление элемента позволит вам увидеть начальную и конечную позиции, а также ничего между ними.мы используем библиотеку абстракций в JavaScript, которая позволяет нам создавать процессы и потоки, которые управляются одним и тем же интерпретатором JavaScript. Это позволяет нам выполнять действия следующим образом:
- Процесс A, Поток 1
- Процесс A, Поток 2
- Процесс B, Поток 1
- Процесс A, Поток 3
- Процесс A, Поток 4
- Процесс B, Поток 2
- пауза Процесс A
- Процесс B, Поток 3
- Процесс B, Поток 4
- Процесс B, Поток 5
- Запустить Процесс A
- Процесс A, Поток 5
Это позволяет некоторую форму планирования и подделки параллелизма, запуска и остановки потоков и т. д., Но это не будет истинной многопоточностью. Я не думаю, что это когда-либо будет реализовано на самом языке, так как истинная многопоточность полезна только в том случае, если браузер может запустить одностраничный многопоточный (или даже более одного ядра), и трудности там намного больше, чем дополнительные возможности.
для будущего JavaScript, проверьте это: https://developer.mozilla.org/presentations/xtech2006/javascript/
традиционно JS предназначался для коротких, быстро выполняющихся фрагментов кода. Если у вас были серьезные вычисления, вы сделали это на сервере - идея JS+HTML app который работал в вашем браузере в течение длительных периодов времени, делая нетривиальные вещи, был абсурдным.
конечно, теперь у нас есть что. Но, это займет немного времени для браузеров, чтобы догнать - большинство из них были разработаны вокруг однопоточной модели, и изменить это не так просто. Google Gears боковые шаги много потенциальные проблемы, требуя, чтобы фоновое выполнение было изолировано - без изменения DOM (поскольку это не потокобезопасно), без доступа к объектам, созданным основным потоком (то же самое). В то время как ограничительный, это, вероятно, будет наиболее практичным дизайном в ближайшем будущем, как потому, что он упрощает дизайн браузера, так и потому, что он уменьшает риск, связанный с тем, чтобы позволить неопытным JS-кодерам возиться с потоками...
Почему это причина не реализовывать многопоточность в Javascript? Программисты могут делать все, что они хотят с инструментами у них.
Итак, давайте не будем давать им инструменты, которые так легко использования что каждый другой сайт, который я открываю, заканчивается сбоем моего браузера. Наивная реализация этого приведет вас прямо на территорию, которая вызвала у MS так много головных болей во время разработки IE7: авторы дополнения играли быстро и свободно с потоком модель, приводящая к скрытым ошибкам, которые стали очевидными, когда жизненные циклы объекта изменились в основном потоке. ПЛОХОЙ. Если вы пишете многопоточные дополнения ActiveX для IE, я думаю, что он поставляется с территорией; не означает, что он должен идти дальше этого.
многопоточность JavaScript (с некоторыми ограничениями) здесь. Google реализовал workers для Gears, а рабочие включены в HTML5. Большинство браузеров уже добавили поддержку этой функции.
потокобезопасность данных гарантирована, поскольку все данные, передаваемые/от работника сериализуются/копируются.
для получения дополнительной информации, читайте:
Я не знаю обоснования этого решения, но я знаю, что вы можете имитировать некоторые преимущества многопоточного программирования с помощью setTimeout. Вы можете создать иллюзию того, что одновременно происходит несколько процессов, хотя на самом деле все происходит в одном потоке.
просто сделайте свою функцию немного работы, а затем вызовите что-то вроде:
setTimeout(function () { ... do the rest of the work... }, 0);и любые другие вещи, которые нужно делать (как для обновления пользовательского интерфейса, анимированные изображения и т. д.) случаются, когда у них появляется шанс.
многопоточный.js обертывает веб-работников и позволяет легко многопоточность в JS. Работает на всех новых браузерах, включая iOS Safari. :)
вы имеете в виду, почему язык не поддерживает многопоточность или почему движки JavaScript в браузерах не поддерживают многопоточность?
ответ на первый вопрос заключается в том, что JavaScript в браузере предназначен для запуска в песочнице и независимо от машины/ОС, чтобы добавить поддержку многопоточности, это усложнит язык и слишком тесно свяжет язык с ОС.
Как и сказал Мэтт б, вопрос не очень ясен. Предполагая, что вы спрашиваете о поддержке многопоточности на языке: потому что это не требуется для 99,999% приложений, запущенных в браузере в настоящее время. Если вам это действительно нужно, есть обходные пути (например, с помощью окна.setTimeout).
В общем многопоточность очень, ОЧЕНЬ, ОЧЕНЬ, ОЧЕНЬ, ОЧЕНЬ, ОЧЕНЬ трудно (я сказал, что это трудно?) чтобы получить право, если вы не ставите дополнительные ограничения (например, используя только неизменяемые данные.)
Intel проводит некоторые исследования с открытым исходным кодом по многопоточности в Javascript, недавно он был продемонстрирован на GDC 2012. Вот ссылка для видео. Исследовательская группа использовала OpenCL, которая в основном фокусируется на чипсетах Intel и ОС Windows. Проект имеет кодовое название RiverTrail и код доступен на GitHub
несколько полезных ссылок:
в настоящее время некоторые браузеры поддерживают многопоточность. Так что, если вам это нужно, вы можете использовать определенные библиотеки. Например, просмотрите следующие материалы:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers (поддержка фоновых потоков);
https://keithwhor.github.io/multithread.js/ (Библиотека).
насколько я слышал, Google Chrome будет иметь многопоточный javascript, поэтому это проблема "текущих реализаций".
по данным в этой статье уже можно реализовать потоковую обработку JavaScript.
Это реализации, которые не поддерживают многопоточность. В настоящее время Google Gears предоставляет способ использовать некоторую форму параллелизма, выполняя внешние процессы, но это все.
новый браузер Google должен выпустить сегодня (Google Chrome) выполняет некоторый код параллельно, разделяя его в процессе.
основной язык, конечно, может иметь такую же поддержку, как, скажем, Java, но поддержка чего-то вроде параллелизма Эрланга нигде не находится горизонт.
без надлежащей поддержки языка для синхронизации потоков, это даже не имеет смысла для новых реализаций, чтобы попробовать. Существующие сложные приложения JS (например, все, что использует ExtJS), скорее всего, неожиданно рухнет, но без
synchronizedключевое слово или что-то подобное, было бы очень трудно или даже невозможно написать новые программы, которые ведут себя правильно.
однако вы можете использовать функцию eval, чтобы довести параллелизм до некоторой степени
/* content of the threads to be run */ var threads = [ [ "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');" ], [ "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');" ] ]; window.onload = function() { var lines = 0, quantum = 3, max = 0; /* get the longer thread length */ for(var i=0; i<threads.length; i++) { if(max < threads[i].length) { max = threads[i].length; } } /* execute them */ while(lines < max) { for(var i=0; i<threads.length; i++) { for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) { eval(threads[i][j]); } } lines += quantum; } }
узел.js 10.5 + поддерживает рабочих потоков как экспериментальная функция (вы можете использовать его с -- experimental-worker флаг включен): https://nodejs.org/api/worker_threads.html
Итак, правило такое:
- если вам нужно сделать I / O bound ops, затем используйте внутренний механизм (он же callback / promise/async-await)
- если вам нужно сделать CPU bound ops, затем используйте worker нити.
рабочие потоки предназначены для долгоживущих потоков, то есть вы создаете фоновый поток, а затем связываетесь с ним через передачу сообщений.
в противном случае, если вам нужно выполнить большую нагрузку на процессор с анонимной функцией, то вы можете пойти с https://github.com/wilk/microjob, крошечная библиотека, построенная вокруг рабочих потоков.
многопоточность с javascript явно возможна с помощью webworkers bring by HTML5.
основное различие между webworkers и стандартной многопоточной средой заключается в том, что ресурсы памяти не совместно используются с основным потоком, ссылка на объект не видна из одного потока в другой. Потоки взаимодействуют путем обмена сообщениями, поэтому можно реализовать алгоритм синхронизации и параллельного вызова метода, следуя событийному дизайну узор.
существует много фреймворков, позволяющих структурировать Программирование между потоками, среди них OODK-JS, платформа OOP js, поддерживающая параллельное программирование https://github.com/GOMServices/oodk-js-oop-for-js
Comments