JavaScript Wielowątkowość

10

Cóż, obecnie JavaScript jest głównym graczem we wszystkich technologiach programistycznych, po stronie klienta, dzięki czemu interfejs użytkownika jest lepszy, logika po stronie klienta, na niektórych serwerach WWW, jak logika po stronie serwera

Dodaj do tego fakt, że ludzie (przynajmniej niektórzy z nich) zaczęli przenosić się podczas tworzenia gier internetowych z Flasha na JavaScript i HTML5

Czy nie nadszedł czas, aby obsługiwał wielowątkowość! czy istnieją przeglądarki, które pozwalają na wielowątkowość JavaScript, czy jest dostępny w jakichkolwiek standardach, HTML5 lub przyszłych wersjach?

Ali
źródło
1
Ludzie nie robią rzeczy, które nie są wymagane. Ludzie, którzy przyczynili się do zaprojektowania Javascript, to także ci, którzy są powiązani z tworzonymi serwerami WWW i przeglądarkami, aby o tym wiedzieli. Chodzi przede wszystkim o użyteczność.
Dipan Mehta

Odpowiedzi:

9

Wielowątkowość nie będzie wykonywana w EcmaScript, ale może być ujawniona w środowiskach hosta.

Klasycznymi przykładami są WebWorkers, który pozwala rozkręcić pracownika pracującego w tle, aby pracował i nadużywał <iframe>jako sposobu na odrodzenie nowych procesów.

Należy zauważyć, że wielowątkowość w JavaScript nie jest potrzebna (są wyjątki, głównie programy związane z grafiką). Nie potrzebujesz wielu wątków, masz już pętlę zdarzeń dla GUI, a renderowanie grafiki (canvas) jest przyspieszane sprzętowo (co oznacza, że ​​GPU renderuje grafikę równolegle dla Ciebie).

Chociaż projekty takie jak webcl są dość ekscytujące.

Raynos
źródło
2
Czy możesz rozwinąć fakt, że „nie jest to konieczne”? Ostatnio natknąłem się na instancję, w której naturalnym przypadkiem programowania na pulpicie byłoby odrodzenie wątku do obsługi zadania, ale oczywiście nie była to łatwa ani standardowa opcja. Pracowałem nad tą sprawą, ale odrodzenie nici wydawało się być bardziej eleganckim rozwiązaniem.
Rig
@rig, z jakim przypadkiem próbujesz sobie poradzić?
Zachary K
@Rig daje konkretny przykład. kosztowne obliczeniowo przetwarzanie jest rzadkie w JavaScript po stronie klienta
Raynos
@Raynos proszę wyjaśnić więcej na temat tego, jak nie jest to potrzebne, myślę tylko, że nie jestem pewien, czy na przykład przy opracowywaniu gier występuje ciężkie obliczenia grafiki i fizyki, a szybkość klatek logicznych zostanie łatwo zmieniona, jeśli myślę, że nie ma wielowątkowości
Ali
@Ali Wyrwałem się i powiedziałem, że są wyjątki. Jednak większość tych ciężkich obliczeń należy przekazać GPU za pośrednictwem interfejsu API z akceleracją sprzętową
Raynos
4

NIE

Wielowątkowość jest jedną z najtrudniejszych rzeczy w oprogramowaniu, aby uzyskać właściwy wynik. Istnieje zbyt wiele przypadków narożnych, które naprawdę trudno jest wypracować, gdy kod nie jest deterministyczny. (Mówię o wielowątkowości z blokadami itp.). Ponadto wszystkie różne biblioteki JavaScript są zbudowane przy założeniu, że nie jest wielowątkowy.

Biorąc to pod uwagę, istnieją pracownicy sieci, którzy dają ramy oparte na aktorach do wykonywania operacji na wiele rodzajów przetwarzania. Możesz tworzyć pracowników i przekazywać dane tam i z powrotem za pośrednictwem zdarzeń.

EDYCJA: Innym powodem jest to, że kiedy JavaScript został utworzony, zrobiono to przy założeniu, że będzie on używany do małych zadań, więc nie będzie wbudowana żadna współbieżność. Aby go teraz przerobić, zepsuje dużo kodu. Dodając pracowników internetowych, możliwe było posiadanie systemu, w którym istnieje współbieżność bez pamięci współdzielonej, ale za pomocą aktorów model współbieżności, który okazał się bardzo solidny w wielu innych językach, takich jak Erlang, Scala, Clojure itp.

(JEŚLI nie możesz powiedzieć, że naprawdę nie lubię współbieżności opartej na blokadzie)

Zachary K.
źródło
1
Multi threading is one of the hardest things in software to get right.- właśnie to zaskoczyłem! Przeglądarka, której używasz, system operacyjny komputera, serwer WWW obsługujący tę stronę - praktycznie każda aplikacja, z której korzystasz na co dzień, jest wielowątkowa. CZY JESTEŚ PEWNY, ŻE OZNACISZ? Jeszcze, aby cię przegłosować, ale zrobię to, jeśli powieszmultithreading is not done because it is hard
Dipan Mehta
3
Wielowątkowość @DipanMehta jest jedną z najtrudniejszych rzeczy w oprogramowaniu. Wszystkie te aplikacje korzystają z tego, ponieważ są napisane przez naprawdę utalentowanych ludzi
Raynos
@Raynos - moja dobroć! Nazywasz mnie utalentowanym! Używam go codziennie ... myślę, że kiedy programujesz w C lub jakiejkolwiek dużej aplikacji, jest to dość powszechne. Chodzi o to, że niezależnie od użycia i wymagań konsorcjum W3C tak naprawdę nie oszczędzało go na Javascript, ponieważ było to zbyt trudne !
Dipan Mehta
2
Twoje poważne rozumienie, jak trudno jest pisać poprawne i wydajne programy równoległe. Ale wielowątkowość nie jest w JavaScript, ponieważ jest to niepotrzebna złożoność (ta rzecz została napisana za 3 tygodnie)
Raynos
2
@DipanMehta prawidłowe wykonanie współzależności opartej na blokadzie, a przybijanie wszystkich przypadków narożnych jest trudnym problemem. Na przykład implementacja czegoś tak prostego jak kolejka z blokadami, które we wszystkich przypadkach można udowodnić, że jest poprawna, byłaby rezultatem do opublikowania jeszcze kilka lat temu. Ale co ważniejsze, próba przebudowania go na język, który go nie miał, wymaga kłopotów.
Zachary K
3

otwarcie javascript na wielowątkowość spowoduje więcej problemów niż rozwiązuje:

obecna architektura jest oparta na zdarzeniach jednowątkowych (najczęściej działa w wątku GUI), innymi słowy, z każdym blokiem kodu możesz mieć pewność, że nic w środowisku nie zmieni się od początku do końca, z wyjątkiem tego, co zostało zmienione w kodzie.

gdy tylko zezwolisz na wykonywanie wyprzedzające lub równoległe, ta funkcja zniknie, oznacza to, że musisz zastosować blokady do danych, które chcesz zmutować, a także mieć trudne warunki debugowania, aby uniknąć

możliwe jest wykonanie pseudo-równoległe z wykorzystaniem limitów czasu, co oznacza podzielenie dużych lub długo działających funkcji na porcje atomowe i użycie, setTimeout(function(){nextstep(args);},1);aby w razie potrzeby można było uruchomić inne rzeczy

maniak zapadkowy
źródło
0

Jakiś czas temu Intel wypuścił River Trail , który umożliwia programowanie równoległe w JavaScript. Jest to jednak tylko wtyczka do Firefoksa i nie słyszałem o mapie drogowej, która wprowadza tę technologię do W3C, a tym bardziej ECMA.

Demian Brecht
źródło