2014-09-09 7 views
7

Philip Roberts wykonuje genialną pracę wyjaśniając pętlę zdarzeń przeglądarki here zapewniając wyraźne wyjaśnienie między stosem wywołań, pętlą zdarzeń, kolejką zadań, a następnie "zewnętrznymi" wątkami, takimi jak webapis. Moje pytanie brzmi: czy są one równorzędne z równoważnymi komponentami w pętli zdarzeń węzła i są one nazywane w zasadzie to samo. Oznacza to, że kiedy wykonuję połączenie za pomocą plików Node i internetowych bibliotek I/O, są to rzeczy, które zdarzają się poza stos, którego callbacks są w kolejce w kolejce zadań?Czy istnieją znaczące różnice między pętlą zdarzeń przeglądarki Chrome a pętlą zdarzeń węzła?

+1

Tak, podstawowa idea jest taka sama. node.js korzysta z mechanizmu JS Chrome. – dandavis

+0

@apsillers Zgodne. Próbuję tylko ustalić, czy istnieją jakieś istotne różnice koncepcyjne, o których należy pamiętać. – JohnGalt

+2

Przeglądarka może mieć wiele pętli zdarzeń (dla JS, dla DOM itp.), Ale koncepcja jest taka sama, tak. – Bergi

Odpowiedz

5

... kiedy wykonuję połączenie za pomocą plików Node i internetowych i/o bibliotek, są to rzeczy, które zdarzają się poza stos, którego callbacks są w kolejce zadań w kolejce?

Tak, zdecydowanie; są asynchroniczne, podobnie jak Ajax i setTimeout są asynchroniczne. Wykonują pewną operację poza stosem wywołań, a po zakończeniu tej operacji dodają zdarzenie do kolejki, które ma zostać przetworzone przez pętlę zdarzeń.

Interfejs API węzła zapewnia rodzaj asynchronicznego no-op, setImmediate. W przypadku tej funkcji "pewna operacja", o której wspomniałem powyżej, to "nie rób nic", po czym element jest natychmiast dodawany na końcu kolejki zdarzeń.

Istnieje mocniejszy process.nextTick, który dodaje zdarzenie do z przodu kolejki zdarzeń, skutecznie odcinając linię i powodując, że wszystkie inne oczekujące zdarzenia oczekują. Jeśli zostanie wywołany rekursywnie, może to spowodować przedłużone opóźnienie innych zdarzeń (do osiągnięcia maxTickDepth).

+4

FWIW: Node.js i Chrome ** nie ** używają tej samej implementacji pętli zdarzeń. Chrome/Chromium używa libevent, a node.js używa libuv. – mscdex

+1

@mscdex powiedzieć whaaaat - dobrze wiedzieć; Będę edytować JAK NAJSZYBCIEJ. Jeśli masz jakieś referencje, z chęcią je wprowadzę (oczywiście sprawdzę to sam i zobaczę, czy mogę znaleźć własną). – apsillers

+1

[tutaj] (https://chromium.googlesource.com/chromium/chromium/+/master/third_party/libevent/README.chromium) to drzewo źródłowe Chromium zawierające libevent. [Tutaj] (https://github.com/joyent/node/blob/962e651476ce2035ce6e15eff5abd0f9c54e039c/src/node.cc#L3629-L3640) jest węzłem używającym libuv dla głównej pętli zdarzeń. Oba używają jednak v8 i wszystkiego, co się z tym wiąże (chociaż węzeł może używać różnych wersji v8 niż Chrome, ponieważ Chrome regularnie aktualizuje się). – mscdex

Powiązane problemy