2012-12-28 7 views
15

Chcę się dowiedzieć, co o tym sądzisz. Czy zaleca się stosowanie żądań synchronicznych (XMLHttpRequest) w pracownikach WWW? Jakie problemy mogę znaleźć?Opinia na temat żądań synchronicznych w pracownikach WWW

Testowałem to w mojej aplikacji i nie znalazłem żadnych problemów. Ale boję się tego zachowania synchronicznego ze względu na stare doświadczenia z jQuery i AJAX. Moja aplikacja pobiera dużą ilość danych z kilku tabel w bazie danych, a to wymaga czasu. Dla każdej paczki danych pobranych z tabeli muszę natychmiast przetworzyć ją, aby nie opóźniała całej rzeczy. Tymczasem użytkownik wchodzi w interakcję z przeglądarką, więc może zostać zablokowany, a ja myślałem, że pracownicy sieci będą działać dobrze. Czy uważasz, że to dobre rozwiązanie? A może powinienem spróbować z żądaniami asynchronus?

Dziękuję.

+0

Jest to możliwe ... i zależy od Twoich wymagań, chociaż AJAX nie byłby AJAX bez asynchronicznego !!! – geekman

+0

Nie mogę polecić SJAX (synchronicznego javascripta i XML), ale chciałbym zobaczyć także kilka trudnych faktów, a moje obawy nie odzwierciedlają zachowania w środowisku wielowątkowym. –

+0

Dziękuję wam. Znam znaczenie A w AJAX :), ale widziałem wielu ludzi robiących coś takiego, kiedy używają pracowników sieci. – Gecko

Odpowiedz

15

nie mam twardych faktów, ale skoro pytasz o opinie ... :)

Jest problem wymowny w Chrome: Zbyt wielu pracowników sieci może spowodować katastrofę cichy (czapki ~ 60-100 , zgodnie z this bug report). Ogólny problem polega na tym, że pracownicy sieci mają duże zasoby, przynajmniej w wersji 8.

Zakładając masz zamiar skończyć wykonywania wielu połączeń HTTP, jeśli robisz synchronicznych połączeń HTTP w sieci Web: Pracownik

  • W pewnym sensie jesteś handel asynchronicznych wywołań HTTP dla sieci asynchronicznej Pracownicy, którzy dodadzą do miksu tylko innego pośrednika i nadal będziecie zarządzać rzeczami asynchronicznie.
  • Jeśli wybierzesz prostszą i bardziej zasobooszczędną trasę i korzystasz tylko z jednego Web Worker, spędzisz dużo czasu, czekając na odpowiedź.
  • Jeśli z drugiej strony korzystasz z wielu pracowników sieci Web, będziesz prawdopodobnie musiał śledzić, który z nich jest bezpłatny, który jest zajęty itp., W którym to przypadku będziesz tworzyć program planujący w domu, zamiast używając tego, co zapiekło się w przeglądarce.
  • Wreszcie, pracownicy WWW są drogie (podobno) i może się zdarzyć, że utworzymy wielu pracowników sieci Web, aby mogli usiąść i czekać na zakończenie połączenia HTTP.

Nie uważam się za eksperta w tej sprawie, więc proszę, weź to za to, co jest warte.

Aktualizacja: Dodawanie plusów i minusów dla różnych scenariuszy.

Niektóre plusy/minusy, które przychodzą na myśl, gdy wybierając między podejmowania synchronicznych i asynchronicznych wywołań HTTP przy użyciu pracownika WWW:

  • Generalnie synchronicznych żądań będzie łatwiej pisać i spowoduje w kodzie, który jest łatwy podążać. Minusem synchronicznych żądań jest to, że mogą zachęcać do pisania długich funkcji, które powinny zostać wyodrębnione w oddzielne, mniejsze funkcje.
  • Jeśli wykonujesz jedno połączenie, nie ma różnicy czasu potrzebnego do zakończenia między tymi dwiema metodami, a synchronizacja jest lepsza, ponieważ jest nieco prostsza. Mówię, że jest to trochę prostsze, ponieważ jedno połączenie asynch z jednym detektorem oddzwaniania jest naprawdę proste.
  • Jeśli wykonujesz wiele połączeń, które muszą się zdarzyć w określonej kolejności, np. Ładowanie danych profilu użytkownika, a następnie pobieranie lokalnej pogody na podstawie ich adresu, połączenia synchroniczne będą lepsze, ponieważ łatwiej będzie pisać i dużo łatwiej przeczytać.Najważniejszą rzeczą w czytaniu jest to, że sekwencyjne zależności w połączeniach będą wyraźnie zarysowane przez wybór synchronizacji połączeń i ich kolejności w funkcji. Im więcej połączeń, tym więcej to będzie miało znaczenie. Jeśli jest wiele połączeń, różnica w złożoności może być drastyczna.
  • Jeśli musisz wykonywać wiele połączeń, które nie muszą się zdarzyć w określonej kolejności, wtedy żądania asynchroniczne są lepsze, ponieważ ogólny proces prawdopodobnie będzie o rząd wielkości szybszy niż w przypadku żądań synchronicznych. Im więcej połączeń wykonasz lub im wolniejsze połączenie, tym większa będzie różnica w łącznym czasie; różnica ta wzrośnie bardzo szybko (wykładniczo?). Z punktu widzenia kogoś czytającego kod, myślę, że używanie synchronicznych żądań w tej sytuacji byłoby trochę mylące, ponieważ sugerowałoby to, że istnieje sekwencyjny charakter wywołań, nawet jeśli nie ma takiego połączenia. Z perspektywy pisania serii żądań asynchronicznych, które nie są od siebie zależne, nie powinno być tak źle, ponieważ wystarczy ustawić licznik, wykonać wszystkie połączenia, zwiększyć licznik w każdym z wywołań zwrotnych i gotowe. kiedy licznik jest równy liczbie wykonanych połączeń.
+0

Nice. Mimo że mówisz, że nie jesteś ekspertem w tej sprawie, twoja opinia jest bardzo interesująca. – Gecko

+0

Może nie wyjaśniłem wszystkich szczegółów. Chcę, aby unikalny pracownik WWW wykonał to zadanie w tle. Chodzi mi o to, że robot sieciowy z pętlą for pobiera dane z każdej tabeli, robi pewne parsowanie i więcej rzeczy. Działa to dobrze z połączeniami synchronicznymi, ale myślę, że muszę użyć niektórych funkcji zwrotnych, jeśli chcę korzystać z wywołań asynchronicznych (czy to lepiej?). To nie jest jedyny robot sieciowy w mojej aplikacji, ale co najmniej jeszcze jeden działa w tym samym czasie, aby wykonywać inne zaplanowane zadania. Czy uważasz, że korzystanie z pracowników sieci nie jest w tym przypadku uzasadnione? Dzięki. – Gecko

+2

Thx o szczegóły. Web Workers są świetni i nie mam zamiaru sugerować, że należy ich unikać. Wygląda na to, że warto to wykorzystać. Pytanie do mnie brzmi, czy sensowne jest używanie sychronicznych XHR. Będzie to mniej programowanie asynchroniczne, ponieważ musisz uruchomić/zatrzymać Web Worker zamiast uruchamiania i obsługi XHRs. Naprawdę sprowadza się do tego, czy warto tego procesu zabierać dłużej? Potencjalnie dużo dłużej, jeśli masz dużo połączeń HTTP do zrobienia. Nie widzę wad w korzystaniu z asynchronicznych żądań HTTP, chyba że ich potrzebujesz. – tiffon

Powiązane problemy