2013-06-20 10 views
6

Wcześniej dzisiaj odpowiedziałem na pytanie z this answer. W przykładzie, który napisałem, użyłem synchronicznej wersji połączenia w module węzła bcrypt. Zdecydowałem się użyć synchronicznej wersji połączenia głównie dlatego, że uważałem, że to sprawiało, że odpowiedź wyglądała trochę czystiej, ale nie sądziłem również, że wpłynie to na wydajność, ponieważ bcrypt to procesor i pamięć intensywna zamiast wejścia I/O. Rozumiem, że węzeł uruchomił prawie cały twój kod na jednym wątku, tak jak robią to przeglądarki, i używał tylko wątków tła dla rzeczy takich jak I/O i dostęp do baz danych. To doprowadziło mnie do przekonania, że ​​zadania intensywnie wykorzystujące procesor nadal zasadniczo "blokowałyby" serwer, ponieważ nie istniały żadne inne wątki, które mogłyby odciążyć pracę.Czy programowanie asynchroniczne w węźle node.js przyspiesza wykonywanie zadań związanych z procesorem?

Komentarz na temat mojej odpowiedzi wskazywał, że moje założenie było błędne, i po pewnych badaniach zdałem sobie sprawę, że tak naprawdę nie mam wielkiego pojęcia, w jaki sposób program node.js radzi sobie z takimi rzeczami. Czy programowanie asynchroniczne w węźle node.js przyspiesza wykonywanie wywołań procesora i pamięci? Jeśli tak, w jaki sposób to robi?

+0

"Czy programowanie asynchroniczne w węźle node.js przyspiesza wykonywanie połączeń procesora i pamięci?" --- udaje, że to robi. Podobnie jak zegary piasku przyspieszają system operacyjny, gdy na nie patrzysz. – zerkms

Odpowiedz

7

To zależy od sposobu wdrożenia modułu.

Jeśli moduł został zaimplementowany bez obsługi wątków, to tak, przetwarzanie związane z CPU nie może być wykonane asynchronicznie. Niektóre funkcje zapewniają wywołania zwrotne, a mój wygląd jest asynchroniczny, ale tak naprawdę nie jest. W rzeczywistości działają synchronicznie i blokują pętlę zdarzeń. Przykładem tego w javascript jest Array.forEach().

Ale moduły mogą zostać zaimplementowane do przetwarzania w wątkach tła. W takim przypadku jest naprawdę asynchroniczny i może przyspieszyć zadania związane z CPU. Przynajmniej zwalnia pętlę zdarzeń, aby obsłużyć przychodzące żądania, podczas gdy wątek tła jest zajęty wynikami obliczeń. Jest to przykład funkcji crypto.pbkdf2() we własnym module Crypto węzła.

Ale w jaki sposób moduły mogą wykonywać kod w innych wątkach, gdy plik node.js działa w jednym wątku?

Pierwotny sposób, w jaki zostało to zaimplementowane, polegał po prostu na tym, że moduł nie został napisany w javascript, ale zamiast tego został napisany w C/C++ i połączony z node.js poprzez jego API.

Ale te dni nawet czyste moduły javascript i funkcje mogą odradzać wątki i/lub procesy. Węzeł ma eksperymentalny moduł o nazwie Cluster, który konfiguruje klaster master/slave dla procesów węzłów. Twój moduł lub kod może następnie uruchomić zadanie związane z CPU w procesie roboczym zwalniając proces głównego węzła, aby obsłużyć pętlę zdarzeń. Istnieje również kilka modułów wątków dostępnych na npm. Po prostu wyszukaj "thread" na stronie npmjs.org.

Tak, tak zadania związane z CPU mogą być uruchamiane szybciej lub przynajmniej nie blokować głównej pętli zdarzeń, uruchamiając asynchronicznie.

+1

Świetna odpowiedź. Po przejrzeniu kodu źródłowego okazuje się, że zalecany przeze mnie moduł bcrypt w rzeczywistości używał kodu C/C++ do wykonywania obliczeń i byłby przyspieszany przez wywołania asynchroniczne. Domyślam się, że komentarz do mojej oryginalnej odpowiedzi był poprawny i prawdopodobnie lepiej będzie, jeśli użyjesz połączeń asynchronicznych domyślnie i wybierzesz tylko synchroniczne połączenia, gdy będziesz wiedział, że jest to konieczne. – TwentyMiles

Powiązane problemy