Wpis z mikrobloga

Czy asynchorniczność w javascript jest realizowana w jednym wątku? Jeśli tak to jak jest to realizowane?

Pytam bo ciągle trafiam na wytłumaczenie: asynchroniczną operację się "zleca" do zrobienia, potem robi się dalej kod synchroniczny i w którymś losowym momencie wraca wynik operacji asynchronicznej. Parafrazując Pudziana "samo się nie zrobiło" - albo w jednym wątku javascript implementuje coś na kształt "skakania między wątkami" , albo jednak jest osobny wątek który wykonuje zakolejkowane operacje asynchroniczne, albo każda operacja asynchroniczna jest wykonywana w osobnych wątkach (ale nie mamy dostępnej synchronizacji, zabijania wątków, konieczności obsługi ich itd).
Jak to jest?

Dla wizualizacji
https://youtu.be/8aGhZQkoFbQ?t=770
w tym momencie gdy coś trafia do "webapi" typu setTimeout to wygląda mi to na osobny wątek, jedynie "callback" który operuje na tym wyniku wykona się w wątku "głównego programu" gdy zostanie wyciągnięty z task queue (czyli w którymś "cyknięciu" event loopa)

#javascript #programowanie #naukaprogramowania #webdev
  • 18
@przeprogramowani: dzięki, ale to jest praktycznie podobne do tego co dałem w pierwszym poście. Chciałem tylko odpowiedzi czy operacje asynchroniczne wykonują się w osobnym wątku, czy to działa w jednym wątku ale js wewnętrznie ma "przełączanie" wykonywania.
W sumie przegladam dalej link który dałem w komentarzu i chyba doszedłem do tego co mnie interesowało
https://youtu.be/Ttwf2TYgZvo?t=449
czyli JS ma jeden wątek, ale maszyna wirtualna na której js działa (czyli jak rozumiem v8
@Zavis: w tym link nazywa się to "współbieżność" a nie asynchroniczność a wydaje mi się, że to jest jakaś różnica.
Ogólnie opisuje wszystkie składowe z filmiku który dałem w pierwszym poście (czyli jak realizowane jest delegowanie asynchronicznych zadań i odbieranie wyników), tylko dalej nie jestem pewien czy operacje asynchroniczne oddelegowane np. do webapi robią się w osobnym wątku.

Chociaż w mojego ostatniego komentarza tutaj (link) wychodzi, że wątki są używane, aż
@rbielawski: to odnosząc się już do tego filmiku, mam rozkminę
gdy on podaje ze operacja asynchroniczna trafia do webapi by się wykonała to zakładam wykonuje się w osobnym wątku (wątku webapi tudzież silnika javascripta). I chciałbym to potwierdzić, bo to tylko mój domysł.
@Lewo: w przeglądarce to jest jeden wątek, drugi osobny z którego możesz skorzystać to serviceWorker. Zrób coś asynchronicznego co muli i długo liczy, to cała karta wyleci Ci w kosmos zanim skończy liczyć lub przeglądarka ubije. Co do node.js działa to podobnie. Sam mechanizm kolejki jest gdzieś przez browser implementowany i zależy to pewnie od producenta przeglądarki. Przy czym jest zasada, że w danym momencie jedno zadanie z kolejki jest przetwarzane.
@isamaul: nie wiem co jest w przeglądarce, istotne jest dla mnie to, że nie ma czegoś takiego jak asynchroniczość ktora używa tylko jednego wątku - bo finalnie operacje asynchroniczne muszą się zrobić "w międzyczasie" synchronicznego kodu. Inaczej po prostu opóźnilibyśmy czekanie na wykonanie zapytania http / odczytu pliku na koniec wykonywania synchronicznego kodu a jednak mamy w tym momencie już wyniki.
@Lewo: no nie, ajax to zwykle operacja I/O i ona po prostu jak się wykona gdzieś przez browserApi(bo js nie wypuszcza requestu z przeglądarki), a następnie odpala zadany callback. Odczyt pliku to też operacja I/O, która jest obsługiwana już przez przeglądarkę i to przeglądarka odpowiada za to, że dany callback w JS się odpali.
@Lewo: no na pewno, inaczej to nie miałoby sensu. Node.js każdą operację i/o robi poza głównym wątkiem. Przeglądarka robi tak samo, w przeciwnym wypadku zablokowałaby cały UI. Pewnie dobrze by było popatrzeć na chromium jak to robi, żeby mieć pewność
@isamaul: no i taki mam swój wniosek - że nie dałoby się tego zrobić za pomocą jednego wątku. Jedynie nie musimy zarządzać tworzeniem wątków, synchronizacją ich wyników, dostępem do wspólnych zasobów - dzieje się to pod spodem (ale wątki są), a my mamy mechanizm (asynchroniczność) który pozwala robić wielowątkowe rzeczy bez przejmowania się (po to też się wydziela kod który pracuje na wynikach - w postaci callbacków, by nie przejmować się
@Lewo: JS jest jednowątkowy i używa event loop. Czyli masz sobie pętlę, która wykonuje kod i następnie sprawdza wydarzenia jakie zaszły, jeśli coś jest, to wykonuje callback i wraca do normalnego wykonywania.