Pytanie Pojedynczy wątek i pętla zdarzeń w Node.js


Po pierwsze, staram się zrozumieć, co to jest Node.Js. Mam dwa pytania.

Pierwsze pytanie 
Od artykuł Felixa, powiedział: "może być tylko jeden odpalenie wywołania w tym samym czasie.Od czasu tego callback zakończył wykonywanie, wszystkie inne callbacks muszą czekać w kolejce".

Następnie rozważ poniższy kod (skopiowany z oficjalnej strony firmy nodejs)

var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8124, "127.0.0.1");

Jeśli dwa żądania klienta są odbierane jednocześnie, oznacza to następujący przepływ pracy:

  1. Pierwsze odebrane zdarzenie żądania http, odebrane zdarzenie Drugiego żądania.
  2. Zaraz po odebraniu pierwszego zdarzenia wywoływana jest funkcja oddzwaniania dla pierwszego zdarzenia.
  3. W pewnym momencie funkcja oddzwaniania dla drugiego zdarzenia musi czekać.

Czy mam rację? Jeśli mam rację, w jaki sposób Node.js kontrolować, czy w ciągu bardzo krótkiego czasu istnieje tysiące żądań klienta.

Drugie Pytanie 
Termin "pętla zdarzeń" jest najczęściej używany w temacie Node.js. Zrozumiałem "Pętlę wydarzenia" jako następującą http://www.wisegeek.com/what-is-an-event-loop.htm;

Pętla zdarzeń - lub główna pętla, jest konstrukcją w obrębie programów, które   kontroluje i wywołuje zdarzenia po pierwszym zdarzeniu.

Początkowym wydarzeniem może być wszystko, w tym naciśnięcie przycisku na   klawiatura lub kliknięcie przycisku na programie (w Node.js, myślę, że   początkowymi zdarzeniami będą żądania http, zapytania db lub dostęp do plików I / O).

Nazywa się to pętlą, nie dlatego, że zdarzenie kręci się i ma miejsce   ciągle, ale ponieważ pętla przygotowuje się do zdarzenia, sprawdza   wydarzenie, wywołuje zdarzenie i ponownie powtarza proces.

Mam konflikt dotyczący drugiego akapitu, zwłaszcza wyrażenie "ponownie powtarza proces"Zgadzam się z powyższym http.createServer Kod z powyższego pytania jest absolutnie "pętlą zdarzeń", ponieważ wielokrotnie nasłuchuje zdarzeń żądania http.

Ale nie wiem, jak zidentyfikować poniższy kod, czy sterowane zdarzeniami lub pętli zdarzeń. Nic nie powtórzy, oprócz funkcji wywołania zwrotnego uruchomionej po zakończeniu zapytania db.

database.query("SELECT * FROM table", function(rows) {
  var result = rows;
});

Proszę, pozwól mi usłyszeć twoje opinie i odpowiedzi.


11
2017-07-10 20:13


pochodzenie




Odpowiedzi:


Odpowiedz jedenTwoja logika jest poprawna: drugie wydarzenie będzie czekać. I będzie wykonywany tak długo, jak długo czekają na niego wywołania zwrotne.

Pamiętaj też, że w świecie techniki nie ma czegoś takiego jak "jednocześnie". Wszystko ma bardzo konkretne miejsce i czas.

Sposób, w jaki węzeł node.js zarządza tysiącami połączeń, polega na tym, że nie ma potrzeby utrzymywania biegu jałowego podczas gdy niektóre wywołania bazy danych blokują logikę lub przetwarzana jest inna operacja IO (na przykład strumienie). Może "obsługiwać" pierwsze żądanie, może tworzyć więcej wywołań zwrotnych i przejść do innych.
Ponieważ nie ma możliwości zablokowania wykonania (z wyjątkiem bzdur podczas gdy (prawda) i podobne), staje się niezwykle skuteczny w rozprowadzaniu rzeczywistych zasobów w całej logice aplikacji.

Wątki - są drogie, a pojemność serwerów wątków jest bezpośrednio związana z dostępną pamięcią. Tak więc większość klasycznych aplikacji internetowych ucierpiałaby tylko dlatego, że pamięć RAM jest używana w wątkach, które są po prostu nieaktywne, podczas gdy trwa blokada kwerend bazy danych lub coś podobnego. W węźle, który nie jest przypadkiem.

Mimo to pozwala tworzyć wiele wątków (jako child_process) cluster, co rozszerza jeszcze więcej możliwości.

Odpowiedz Two. Nie ma czegoś takiego jak "pętla", o której moglibyście pomyśleć. Za kulisami nie będzie pętli, która sprawdza, czy istnieją połączenia lub jakiekolwiek dane odebrane i tak dalej. Obecnie jest również obsługiwany przez metody Async.

Z punktu widzenia aplikacji nie ma "głównej pętli", a wszystko z punktu widzenia programisty jest sterowane zdarzeniami (a nie pętlą zdarzeń).

W przypadku z http.createServer, wiążemy wywołanie zwrotne jako odpowiedź na żądania. Wszystkie operacje związane z gniazdami i elementy IO będą wykonywane za kulisami, a także uzgadnianie HTTP, analizowanie nagłówków, kwerend, parametrów i tak dalej. Gdy dzieje się to za kulisami, a zadanie zostanie zakończone, zachowa dane i wywoła oddzwonienie do pętli zdarzeń z pewnymi danymi. Gdy pętla zdarzeń będzie wolna i nadejdzie czas, wykona w aplikacji node.js kontekst wywołania zwrotnego z danymi zza kulis.

Z prośbą o bazę danych - ta sama historia. To źle przygotowuje i pyta o rzeczy (może to zrobić nawet asynchronicznie ponownie), a następnie wywoła oddzwonienie, gdy baza danych zareaguje, a dane zostaną przygotowane do kontekstu aplikacji.

Szczerze mówiąc, wszystko czego potrzebujesz w node.js to zrozumieć koncepcję, ale nie implementację zdarzeń. I najlepszy sposób na zrobienie tego - eksperymentuj.


8
2017-07-11 00:06



co się stanie gdy createServer ma operacje wywołania zwrotnego (asynchroniczne)? Czy pierwsza prośba pozwala powiedzieć, czy niektóre operacje synchronizacji wywołują wywołanie zwrotne i natychmiast? I rozpocząć przetwarzanie żądania drugiego, gdy wywołanie zwrotne z pierwszego żądania nadal działa? - Manali


1) Tak masz rację.

Działa, ponieważ wszystko, co robisz z węzłem, jest głównie związane z we / wy.

Kiedy pojawia się nowe żądanie (zdarzenie), jest ono umieszczane w kolejce. W czasie inicjalizacji węzeł przydziela wątek, który jest odpowiedzialny za odradzanie wątków do przetwarzania związanego z we / wy, takich jak połączenia sieciowe / gniazda, baza danych itp. (Nie jest to blokowanie).

Teraz twoje "wywołania zwrotne" (lub programy obsługi zdarzeń) są bardzo szybkie, ponieważ większość tego, co robisz, jest najprawdopodobniej operacjami CRUD i I / O, a nie procesorem.

Dlatego te wywołania zwrotne dają wrażenie, że są przetwarzane równolegle, ale tak naprawdę nie są, ponieważ faktyczna praca równoległa jest wykonywana za pomocą ThreadPool (z wielowątkowością), podczas gdy wywołania zwrotne per se same otrzymują wynik z tych wątków, aby przetwarzanie mogło być kontynuowane i wysłać odpowiedź do klienta.

Możesz to łatwo sprawdzić: jeśli masz połączenia zwrotne ciężki Zadania procesora, możesz być pewien, że nie będziesz w stanie przetworzyć tysięcy żądań na sekundę, a jego skala będzie naprawdę zła, w porównaniu z systemem wielowątkowym.

2) Masz znowu rację.

Niestety, ze względu na te wszystkie abstrakcje, musisz zanurkować, aby zrozumieć, co dzieje się w tle. Jednak tak, istnieje pętla.

W szczególności implementowany jest Nodejs libuv.

Interesujące dla czytać.

Ale nie wiem, jak zidentyfikować poniższy kod, czy sterowane zdarzeniami lub pętli zdarzeń. Nic nie powtórzy, oprócz funkcji wywołania zwrotnego uruchomionej po zakończeniu zapytania db.

Zdarzenie sterowane jest terminem, którego zwykle używasz, gdy istnieje pętla zdarzeń, a to oznacza aplikację sterowaną przez zdarzenia, takie jak kliknięcie przycisku, dotarcie danych itp. Zwykle przypisujesz wywołanie zwrotne do takich zdarzeń.


1
2018-03-18 15:24