Jakie są przypadki użycia dla pracowników sieci Web? [Zamknięte]

174

Szukam rzeczywistego scenariusza do korzystania z interfejsu Web Workers API .

Sergey Ilinsky
źródło
Czy są obsługiwane przez platformy mobilne / webkit?
dmp
Nie wiem na pewno, ale przypuszczam, że tak.
Sergey Ilinsky
6
@danp Browser support: caniuse.com/webworkers
Dheeraj Vepakomma
1
Napisałem przypadek, w którym po raz pierwszy użyliśmy pracownika internetowego, a następnie stwierdziłem, że jest nam lepiej bez niego - windward.net/blogs/web-workers-abandon/#.Vl3QdXarQ-U
David Thielen

Odpowiedzi:

143
  • John Resig ( znany z jQuery) ma tutaj kilka interesujących przykładów wykorzystania pracowników sieciowych - gier, grafiki, kryptowalut.

  • Innym zastosowaniem jest Web I / O - innymi słowy odpytywanie adresów URL w tle. W ten sposób nie blokujesz interfejsu użytkownika oczekującego na wyniki sondowania.

  • Kolejne praktyczne zastosowanie: w Bespin używają Web Workerów do podświetlania składni, czego nie chcesz blokować edycji kodu podczas korzystania z aplikacji.

  • Od Mozilli : Jednym ze sposobów przydatności pracowników jest umożliwienie Twojemu kodowi wykonywania obliczeń intensywnie wykorzystujących procesor bez blokowania wątku interfejsu użytkownika.

    Jako praktyczny przykład pomyśl o aplikacji, która ma dużą tabelę # (to jest prawdziwy świat, BTW - zaczerpnięte z aplikacji, którą zaprogramowałem ~ 2 lata temu). Możesz zmienić jeden # w tabeli za pomocą pola wejściowego, a kilka innych liczb w różnych kolumnach zostanie ponownie obliczonych w dość intensywnym procesie.

    Stary przepływ pracy: Zmień #. Idź po kawę, podczas gdy JavaScript przetwarza zmiany w innych liczbach, a strona internetowa nie odpowiada przez 3 minuty - po tym, jak zoptymalizowałem ją do diabła iz powrotem. Wracaj z kawą. Zmień drugi #. Powtarzaj wiele razy. Kliknij przycisk ZAPISZ.

    Nowy przepływ pracy z pracownikami może wyglądać następująco: Zmień #. Otrzymuj komunikat o stanie, że coś jest ponownie obliczane, ale możesz zmienić inne #s. Zmień więcej #s. Po zakończeniu zmiany poczekaj, aż status zmieni się na „wszystkie obliczenia zakończone, możesz teraz przejrzeć ostatnie # i zapisać”.

DVK
źródło
5
Świetne linki! Nigdy nie słyszałem o robotnikach ... mmm, robotnikach. (Czas iść na długi, gorący prysznic ...)
Peter Rowell,
51
Wiem, że to odpowiedź sprzed dwóch lat, ale chciałem tylko wspomnieć, że nie powinieneś potrzebować pracowników sieci do punktu 2 (adresy URL do odpytywania). XHR działa asynchronicznie i nie blokuje; nie ma potrzeby uruchamiania żądań XHR w osobnym wątku. (Oczywiście w nowoczesnej aplikacji chciałbyś używać WebSockets zamiast odpytywania.)
josh3736
6
@ josh3736 - Masz rację, ale teraz jestem ciekawy, czy wykonywanie wielu równoległych żądań aync XHR może w jakiś sposób sprawić, że przeglądarka będzie niezadowolona? Ponadto potrzebne są lokalne zasoby do przetwarzania odpowiedzi XHR, w przypadku których pracownicy mogą być przydatni.
DVK,
Jeśli wszystkie równoległe żądania są kierowane do tego samego serwera, osiągniesz limit na nazwę hosta gdzieś pomiędzy 2 a 9 równoczesnych połączeń. (Zakładam, że limit dotyczy wszystkich połączeń, niezależnie od tego, czy są one inicjowane z głównego wątku, czy z procesu roboczego). Oczywiście, jeśli masz jednocześnie 10 jednoczesnych żądań, prawdopodobnie musisz przemyśleć projekt aplikacji.
josh3736
2
Przepraszam, moje proste pytanie, ale co w powyższym przykładzie nazywasz „#”?
Shrewdbeans
35

Używałem ich do wysyłania większych ilości danych z przeglądarki na serwer. Oczywiście możesz to zrobić za pomocą zwykłych połączeń AJAX, ale jeśli zajmie to jedno z cennych połączeń na nazwę hosta. Ponadto, jeśli użytkownik dokona przejścia strony podczas tego procesu (np. Kliknie link), Twoje obiekty JavaScript z poprzedniej strony znikną i nie możesz przetwarzać wywołań zwrotnych. Kiedy używany jest web Worker, ta czynność ma miejsce poza pasmem, więc masz lepszą gwarancję, że zostanie ukończona.

Kevin Hakanson
źródło
2
Ale musisz wymienić wiadomość z pracownikiem sieciowym. Kiedy koszt tej operacji zasługuje na korzyść?
Danielo515
6

Inny przypadek użycia:

Kompresja / dekompresowanie plików w tle, jeśli masz dużo obrazów i innych plików multimedialnych, które są wymieniane z serwera w formacie skompresowanym.

sbr
źródło
39
To nie powinno się dziać w JavaScript. Obrazy są już kompresowane (PNG, JPEG) przy użyciu algorytmów zaprojektowanych do wydajnej kompresji danych obrazu. Dodanie kolejnej warstwy kompresji na wierzch może faktycznie zwiększyć rozmiar danych. W przypadku innych typów danych (np. Dużego pliku JSON) kompresja powinna być obsługiwana przez przeglądarkę przy użyciu standardowego gzipowania HTTP. Jeśli wykonujesz kompresję w JavaScript, prawdopodobnie robisz to źle .
josh3736
11
Widzę, że niektórzy użytkownicy dyskwalifikują ten przypadek użycia, ale oto, co miałem na myśli. Rozważ aplikację taką jak MS Word, jak potężny edytor dokumentów, za pomocą którego możesz osadzać obrazy, pliki muzyczne, dane, arkusze Excela itp. w JEDNYM pliku. i weź pod uwagę, że masz klienta internetowego i klienta stacjonarnego oraz klienta IOS / Android. W takim przypadku można zapisać całą zawartość pliku w pliku zip, a następnie rozpakować na każdym kliencie.
sbr
3
Bookmarklet Instapaper kompresuje zapisywaną stronę przed wysłaniem jej na serwer. Oszczędza czas i przepustowość.
stevendaniels
12
@ josh3736 Jedyne, co może zrobić przeglądarka, to spakować plik z serwera WWW (lub pamięci podręcznej przeglądarki). Nie może dekompresować danych z pamięci lokalnej ani z gniazda sieciowego i nie może w ogóle kompresować. Aplikacje internetowe wysyłają coraz większą ilość danych w górę, a kompresja do tego jest niezwykle przydatna. Równie ważne rok temu, kiedy to zostało opublikowane: Jeśli nie możesz wymyślić żadnych ważnych przypadków użycia kompresji JavaScript, prawdopodobnie brakuje ci wyobraźni.
Adria,
1
@Adria: Standard WebSocket jest w trakcie dodawania obsługi kompresji . Jeśli masz do czynienia z obrazami generowanymi w przeglądarce ( <canvas>), możesz pobrać dane obrazu w formacie skompresowanym (np. Png). Nie chodziło mi o to, że kompresowanie w JS nigdy nie jest właściwe; Chodziło mi o to, że w większości przypadków tak nie jest , aw większości przypadków - szczególnie w przypadku obrazów, o czym mówi ta odpowiedź - istnieje lepsza alternatywa dla toczenia własnej kompresji.
josh3736