W jaki sposób łączy się pętla zdarzeń, Kolejka połączeń zwrotnych i pojedynczy wątek Javascript?

CEL OGÓLNY

Chciałbym wiedzieć, jak następujące elementy środowiska javascript łączą się ze sobą jako system .

  • Javascript Engine
  • Pętla Zdarzeń
  • Kolejka Zdarzeń

Możemy ograniczyć to do środowiska przeglądarki ponieważ node został opisany w innym artykule ( tutaj )

Rzeczy, które (wierzę) Rozumiem:

  • Javascript jest jednowątkowy i dlatego ma tylko jeden callstack.

  • Środowiska Javascript zapewniają tylko kilka funkcji, które są naprawdę asynchroniczne. Mogą to być funkcje setTimeout(), setInterval () i I / O.

  • programista nie może tworzyć własnych funkcji asynchronicznych bez użycia jednej z nich.
  • Javascript sam działa synchronicznie, ale poprzez jego funkcje asynchroniczne może wywoływać niedoszłe funkcje blokujące, gdy bieżący callstack jest czysty.

Przykład:

      console.log(‘Sync code started…’);

      setTimeout(function asyncLog() {
           console.log(‘Async function has completed’)
      }, 2000);

      console.log(‘Sync code finished…')

PRZYKŁADOWE KROKI:

( proszę poprawić kroki, jeśli się mylę )

  1. 'Sync code started...' is logged
  2. setTimeout jest dodawany do stosu, ale natychmiast zwraca kontrolkę
  3. setTimeout jest wysyłany do innego 'wątku' ... 'worker'? poza pojedynczym wątkiem javascript, aby policzyć milisekundy 2000
  4. 'Sync code finished...' is logged
  5. po 2000 milisekund asynclog() jest wypychany do kolejki zdarzeń
  6. ponieważ callstack jest czysty, pętla zdarzeń sprawdza kolejkę zdarzeń pod kątem oczekujących wywołań zwrotnych
  7. asynclog() jest usuwany z kolejki i wypychany do stosu przez pętlę zdarzeń
  8. 'funkcja Async została zakończona' jest rejestrowana
  9. callstack is now clear

Pytania

Nie trzeba na nie odpowiadać jeden po drugim, jeśli ktoś mógłby stworzyć przegląd kroków dotyczących tego, jak i gdzie działają funkcje asynchroniczne (takie jak setTimeout) od momentu, gdy po raz pierwszy uderzył w callstack do kiedy są one wywołane z powrotem do callstack.

  1. w kroku 3, Kto tworzy ten nowy wątek? Czy to przeglądarka?
    • Ten nowy wątek jest blokowany poprawnie?
    • co się stanie, jeśli masz pętlę, która tworzy 1000 setTimeouts. Czy powstało 1000 "wątków"?
    • czy istnieje limit liczby wątków, które mogą być wywołane na raz?
    • Kiedy nowy wątek zakończy wykonywanie, jak kończy się w kolejce?
  2. kto dostarcza imprezę Kolejka?
  3. kto dostarcza pętlę zdarzeń?
    • czy pętla zdarzeń sprawdza kolejkę zdarzeń?
    • czy wątek javascript jest świadomy pętli zdarzeń? Czy pętla zdarzeń po prostu wciska rzeczy na stos?
    • skąd pętla zdarzeń wie, kiedy stos jest czysty?
Author: kurtcorbett, 2015-04-02

1 answers

Twoje zrozumienie i twój przykład wydają się być w zasadzie poprawne. A teraz do Waszych pytań:

W kroku 3, Kto tworzy ten nowy wątek? Czy to przeglądarka?

Tak. Jest to w zasadzie rzecz, która dostarcza implementację dla tych" prawdziwie asynchronicznych " funkcji. IIRC, setTimeout jest zaimplementowany bezpośrednio w silnikach JS, podczas gdy sieciowe IO byłoby zdecydowanie odpowiedzialnością przeglądarki-ale tak naprawdę nie ma znaczenia, kto je tworzy. W końcu w swojej " przeglądarce środowisko " to zawsze jakaś część przeglądarki.

Ten nowy wątek jest blokowany poprawnie?

Tak. Nie. To zależy od pracy, którą należy wykonać, tj. jaką funkcję asynchroniczną wywołałeś. Niektóre mogą wymagać przędzenia nowego wątku, ale dla prostych timeoutów jestem prawie pewien, że używane jest nieblokujące wywołanie systemowe.

Co się stanie, jeśli masz pętlę, która tworzy 1000 setTimeouts. Czy powstało 1000 "wątków"?

Możliwe. Mało prawdopodobne, chociaż. Zakładam, że dla tych akcji asynchronicznych, które naprawdę wymagają własnego wątku, używana jest pula wątków, a żądania są w kolejce. Rozmiar tej puli może być ukryty w trzewiach konfiguracji przeglądarki.

Czy istnieje limit liczby wątków, które mogą być wywołane na raz?

To będzie kontrolowane przez system operacyjny.

Kiedy nowy wątek zakończy wykonywanie, jak kończy się w kolejce? Kto dostarczy kolejkę wydarzeń?

Zasadniczo, ostatnią akcją każdego takiego wątku jest umieszczenie jego wyniku w kolejce zdarzeń.

Kto dostarcza pętlę zdarzeń? Czy pętla zdarzeń sprawdza kolejkę zdarzeń?

Powiedziałbym, że jest to szczegół implementacji, niezależnie od tego, czy pętla sonduje kolejkę, czy kolejka napędza iteracje pętli.

Czy wątek javascript jest świadomy pętli zdarzeń? Czy pętla zdarzeń po prostu wciska rzeczy na stos?

Powiedziałbym, że javascript uruchamia w zdarzeniu wątek pętli. Pętla zdarzeń po prostu wielokrotnie wyskakuje zdarzenia z kolejki i wykonuje ich javascript.

Skąd pętla zdarzeń wie, kiedy stos jest czysty?

Pętla zdarzeń wywołuje wykonanie javascript - więc stos jest czysty, gdy javascript powróci.

 10
Author: Bergi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 21:37:31