Czy istnieje sposób na wielowątkowość w JavaScript?
javascript
multithreading
Niyaz
źródło
źródło
Odpowiedzi:
Zobacz http://caniuse.com/#search=worker, aby uzyskać najbardziej aktualne informacje pomocy technicznej.
Poniżej przedstawiono stan wsparcia około 2009 roku.
Słowa, które chcesz wyszukać w Google, to wątki robocze JavaScript
Oprócz Gears nie ma nic obecnie dostępnego, ale dużo się mówi o tym, jak to zaimplementować, więc przypuszczam, że obserwuję to pytanie, ponieważ odpowiedź bez wątpienia zmieni się w przyszłości.
Oto odpowiednia dokumentacja dla Gears: WorkerPool API
WHATWG ma projekt rekomendacji dla wątków roboczych: Pracownicy sieciowi
Jest też wątki robocze DOM w Mozilli
Aktualizacja: czerwiec 2009, obecny stan obsługi wątków JavaScript przez przeglądarki
Firefox 3.5 ma pracowników internetowych. Kilka demonstracji pracowników sieciowych, jeśli chcesz zobaczyć ich w akcji:
Wtyczkę Gears można również zainstalować w przeglądarce Firefox.
Safari 4 i nocne koszule WebKit mają wątki robocze :
Chrome ma wypaloną wtyczkę Gears, więc może wykonywać wątki, chociaż wymaga monitu o potwierdzenie od użytkownika (i używa innego interfejsu API dla pracowników internetowych, chociaż będzie działać w dowolnej przeglądarce z zainstalowaną wtyczką Gears):
IE8 i IE9 mogą wykonywać wątki tylko z zainstalowaną wtyczką Gears
źródło
Inny sposób wykonywania wielowątkowości i asynchroniczności w JavaScript
Przed HTML5 JavaScript umożliwiał wykonanie tylko jednego wątku na stronę.
Było kilka hacky sposobem symulowania asynchronicznego wykonania z Wydajność ,
setTimeout()
,setInterval()
,XMLHttpRequest
lub obsługi zdarzeń (patrz końca tego słupka na przykład z wydajnością isetTimeout()
).Ale dzięki HTML5 możemy teraz używać wątków roboczych do równoległego wykonywania funkcji. Oto przykład użycia.
Prawdziwa wielowątkowość
Wielowątkowość: wątki robocze JavaScript
HTML5 wprowadził wątki Web Worker (patrz: kompatybilność przeglądarek )
Uwaga: IE9 i wcześniejsze wersje go nie obsługują.
Te wątki robocze to wątki JavaScript, które działają w tle bez wpływu na wydajność strony. Aby uzyskać więcej informacji o programie Web Worker, przeczytaj dokumentację lub ten samouczek .
Oto prosty przykład z 3 wątkami Web Worker, które liczą się do MAX_VALUE i pokazują bieżącą obliczoną wartość na naszej stronie:
Widzimy, że trzy wątki są wykonywane współbieżnie i wypisują ich aktualną wartość na stronie. Nie zamrażają strony, ponieważ są wykonywane w tle z oddzielnymi wątkami.
Wielowątkowość: z wieloma ramkami iframe
Innym sposobem osiągnięcia tego jest użycie wielu ramek iframe , z których każdy wykona wątek. Możemy podać elementowi iframe kilka parametrów poprzez adres URL, a element iframe może komunikować się z jego rodzicem w celu uzyskania wyniku i wydrukowania go z powrotem (element iframe musi znajdować się w tej samej domenie).
Ten przykład nie działa we wszystkich przeglądarkach! iframe zwykle działają w tym samym wątku / procesie co strona główna (ale Firefox i Chromium wydają się traktować to inaczej).
Ponieważ fragment kodu nie obsługuje wielu plików HTML, podam tutaj tylko różne kody:
index.html:
thread.html:
Symuluj wielowątkowość
Jednowątkowy: emuluj współbieżność JavaScript z setTimeout ()
Naiwnym sposobem byłoby wykonywanie funkcji
setTimeout()
jedna po drugiej w ten sposób:Ale ta metoda nie działa, ponieważ każde zadanie będzie wykonywane jedno po drugim.
Możemy zasymulować wykonanie asynchroniczne, wywołując funkcję rekurencyjnie w następujący sposób:
Jak widać ta druga metoda jest bardzo powolna i zawiesza przeglądarkę, ponieważ wykorzystuje główny wątek do wykonywania funkcji.
Jednowątkowy: emuluj współbieżność JavaScript z wydajnością
Yield to nowa funkcja w ECMAScript 6 , działa tylko na najstarszej wersji Firefoksa i Chrome (w Chrome musisz włączyć Eksperymentalny JavaScript pojawiający się w chrome: // flags / # enable-javascript-harmony ).
Generator umożliwia wstrzymanie wykonywania funkcji i wznowienie jej później. Generator może służyć do planowania funkcji za pomocą techniki zwanej trampolinem .
Oto przykład:
źródło
Dzięki HTML5 „side-specs” nie ma już potrzeby hakowania javascript za pomocą setTimeout (), setInterval () itp.
HTML5 & Friends wprowadza specyfikację javascript Web Workers . Jest to interfejs API do asynchronicznego i niezależnego uruchamiania skryptów.
Linki do specyfikacji i samouczka .
źródło
W JavaScript nie ma prawdziwego wątku. JavaScript, który jest plastycznym językiem, pozwala na jego emulację. Oto przykład , na który natknąłem się pewnego dnia.
źródło
W JavaScript nie ma prawdziwej wielowątkowości, ale możesz uzyskać asynchroniczne zachowanie za pomocą
setTimeout()
i asynchronicznych żądań AJAX.Co dokładnie próbujesz osiągnąć?
źródło
Oto tylko sposób na symulację wielowątkowości w JavaScript
Teraz utworzę 3 wątki, które będą obliczać dodawanie liczb, liczby można podzielić przez 13, a liczby przez 3 do 10000000000. A te 3 funkcje nie są w stanie działać w tym samym czasie, co oznacza Współbieżność. Ale pokażę ci sztuczkę, która sprawi, że te funkcje będą działać rekurencyjnie w tym samym czasie: jsFiddle
Ten kod należy do mnie.
Część ciała
Część JavaScript
Mam nadzieję, że ten sposób będzie pomocny.
źródło
Możesz użyć Narrative JavaScript , kompilatora, który przekształci twój kod w maszynę stanów, skutecznie umożliwiając emulację wątków. Czyni to poprzez dodanie do języka operatora „yielding” (zapisanego jako „->”), który umożliwia pisanie kodu asynchronicznego w pojedynczym, liniowym bloku kodu.
źródło
Nowy silnik V8, który powinien dziś wyjść, obsługuje go (tak myślę)
źródło
W surowym JavaScript najlepsze, co możesz zrobić, to użyć kilku wywołań asynchronicznych (xmlhttprequest), ale nie jest to tak naprawdę wielowątkowe i bardzo ograniczone. Google Gears dodaje do przeglądarki szereg interfejsów API, z których niektóre mogą być używane do obsługi wątków.
źródło
Jeśli nie możesz lub nie chcesz używać żadnych elementów AJAX, użyj elementu iframe lub dziesięciu! ;) Możesz mieć procesy działające w ramkach iframe równolegle ze stroną wzorcową bez martwienia się o problemy porównywalne z różnymi przeglądarkami lub problemy ze składnią z dot net AJAX itp., A także możesz wywołać JavaScript strony wzorcowej (w tym JavaScript, który został zaimportowany) z pliku iframe.
Np. W nadrzędnym elemencie iframe, aby wywołać
egFunction()
dokument nadrzędny po załadowaniu treści iframe (to jest część asynchroniczna)Dynamicznie generuj ramki iframe, aby główny kod HTML był od nich wolny, jeśli chcesz.
źródło
Inną możliwą metodą jest użycie interpretera javascript w środowisku javascript.
Tworząc wielu interpreterów i kontrolując ich wykonanie z poziomu głównego wątku, można symulować wielowątkowość z każdym wątkiem działającym w swoim własnym środowisku.
Podejście jest nieco podobne do pracowników sieci, ale dajesz tłumaczowi dostęp do globalnego środowiska przeglądarki.
Zrobiłem mały projekt, aby to zademonstrować .
Bardziej szczegółowe wyjaśnienie w tym poście na blogu .
źródło
Javascript nie ma wątków, ale mamy pracowników.
Pracownicy mogą być dobrym wyborem, jeśli nie potrzebujesz udostępnionych obiektów.
Większość implementacji przeglądarek w rzeczywistości rozdziela procesy robocze na wszystkie rdzenie, umożliwiając wykorzystanie wszystkich rdzeni. Możesz zobaczyć demo tego tutaj .
Opracowałem bibliotekę o nazwie task.js, która bardzo to ułatwia.
Przykładem może być
źródło
Dzięki specyfikacji HTML5 nie musisz pisać zbyt dużo JS dla tego samego ani szukać hacków.
Jedną z funkcji wprowadzonych w HTML5 są Web Workers czyli JavaScript działający w tle, niezależnie od innych skryptów, bez wpływu na wydajność strony.
Jest obsługiwany w prawie wszystkich przeglądarkach:
Chrome - 4.0+
IE - 10.0+
Mozilla - 3.5+
Safari - 4.0+
Opera - 11.5+
źródło