2012-02-29 13 views
43

Nie rozumiem kilku rzeczy o nodejach. Każde źródło informacji mówi, że plik node.js jest bardziej skalowalny niż standardowe serwery sieciowe ze względu na brak blokowania wątków i przełączanie kontekstów, ale zastanawiam się, czy jeśli node.js nie używa wątków, to czy obsługuje równolegle równoległe żądania? Co oznacza model zdarzeń we/wy?Jak działa node.js?

Twoja pomoc jest bardzo cenna. Dzięki

Odpowiedz

74

Węzeł jest całkowicie sterowany zdarzeniami. Zasadniczo serwer składa się z jednego wątku przetwarzającego jedno zdarzenie po drugim.

Nowy wniosek przychodzi w jednym z wydarzeń. Serwer rozpoczyna przetwarzanie, a gdy wystąpi blokująca operacja IO, nie czeka ona aż się zakończy i zamiast tego zarejestruje funkcję zwrotną. Serwer natychmiast rozpoczyna przetwarzanie kolejnego zdarzenia (może innego żądania). Kiedy operacja IO zostanie zakończona, jest to inny rodzaj zdarzenia, a serwer ją przetworzy (tj. Będzie kontynuować pracę nad żądaniem), wykonując wywołanie zwrotne, gdy tylko będzie miał czas.

Dzięki temu serwer nigdy nie musi tworzyć dodatkowych wątków ani przełączać się między wątkami, co oznacza, że ​​ma bardzo mało narzutów. Jeśli chcesz, aby w pełni korzystać z wielu rdzeni sprzętowe, wystarczy uruchomić wiele instancji node.js

Aktualizacja Na najniższym poziomie (kod C++, nie JavaScript), there actually are multiple threads w node.js: jest pulę robotów IO, której zadanie polega na odbieraniu przerwań IO i umieszczaniu odpowiednich zdarzeń w kolejce do przetworzenia przez główny wątek. Zapobiega to przerwaniu głównego wątku.

+1

Dzięki Michael. Rozumiem, że operacje asynchroniczne IO mają naturę JS, ale nie rozumiem, że jeśli node.js/JS jest pojedynczym wątkiem, to jak obsługuje operacje asynchroniczne. Może pracować z asynchroniczną operacją I/O równolegle z kodem po stronie serwera, ale w jaki sposób. – Davita

+3

@Davita: Operacje we/wy nie są wykonywane przez procesor. Kod po stronie serwera nie musi się angażować, dopóki zewnętrzny sprzęt nie wypełni jakiegoś bufora i poinformuje o tym procesor poprzez mechanizm przerwań. –

+5

@Davita istnieje mały zapis o pętli zdarzeń node.js tutaj: http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ – LoG

0

Chociaż pytanie zostało już wyjaśnione przez długi czas, myślę o tym samym.

Węzeł JS to technologia z pojedynczym gwintem. Zasadniczo obawą twórcy węzła JS (Ryan Dahl) było to, że przetwarzanie równoległe za pomocą wielu wątków nie jest właściwe lub zbyt skomplikowane.

jeśli node.js nie wykorzystuje wątki jaki sposób obsłużyć jednoczesnych żądań w równoległych

Ans: Jest to całkowicie błędne zdanie, gdy mówisz, że nie korzysta z wątków, węzeł JS stosowanie nici ale w inteligentny sposób. wykorzystuje pojedynczy wątek służyć wszystkie żądania HTTP & wielu wątków w puli wątków (w libuv) do obsługi każde działanie blokowania

Libuv: biblioteki do obsługi asynchronicznego we/wy.

Co oznacza model zdarzeń we/wy?

Odp .: Właściwy termin to nieblokujący I/O. To prawie nigdy nie blokuje, jak mówi oficjalna strona Node JS. Kiedy dowolne żądanie trafia do serwera węzła, nigdy nie umieszcza go w kolejce. Przyjmuje żądanie i rozpoczyna wykonywanie, jeśli jest to blokowanie, po czym zostało wysłane do działającego obszaru wątków i zarejestrowało wywołanie zwrotne dla tego samego, zaraz po zakończeniu wykonywania kodu, wywołuje to samo wywołanie zwrotne i przechodzi do kolejki zdarzeń i przetwarzane przez pętlę zdarzeń po które tworzą odpowiedź i wysyłają do odpowiedniego klienta.

Przydatny link: click here

Powiązane problemy