Jeśli dobrze rozumiem, Node JS nie blokuje ... więc zamiast czekać na odpowiedź z bazy danych lub innego procesu, przeszedł do czegoś innego i sprawdził później.
Jest również jednowątkowy.
Czy to wszystko oznacza, że dany proces Node JS może w pełni i efektywnie wykorzystywać pojedynczy rdzeń procesora, ale nie będzie używał żadnego innego rdzenia na maszynie, ponieważ nigdy nie będzie używał więcej niż jednego na raz.
To oczywiście oznacza, że inne procesory mogą być nadal używane przez inne procesy do takich rzeczy, jak baza danych SQL lub inne celowo oddzielone podprogramy o dużej mocy obliczeniowej, o ile są oddzielnymi procesami.
Również w przypadku, gdy proces Node JS ma nieskończoną pętlę lub długotrwałą funkcję, proces ten nie jest już w żaden sposób przydatny, dopóki niekończąca się pętla lub długo działająca funkcja nie zostanie zatrzymana (lub cały proces zostanie zabity).
Czy to wszystko w porządku? Czy mam rację w moim rozumieniu?
źródło
Odpowiedzi:
Prawie dobrze, tak. Serwer node.js ma wewnętrzną pulę wątków, dzięki czemu może wykonywać operacje blokujące i powiadamiać główny wątek za pomocą wywołania zwrotnego lub zdarzenia, gdy wszystko się zakończy.
Wyobrażam sobie więc, że będzie wykorzystywał w ograniczonym zakresie inny rdzeń dla puli wątków, na przykład jeśli wykonasz odczyt nieblokującego systemu plików, jest to prawdopodobnie zaimplementowane przez nakazanie wątkowi z puli wątków wykonania odczytu i ustawienia wywołania zwrotnego, gdy to się robi, co oznacza, że odczyt może się odbywać w innym wątku / rdzeniu, podczas gdy główny program node.js robi coś innego.
Ale z punktu widzenia node.js jest całkowicie jednowątkowy i nie używa bezpośrednio więcej niż jednego rdzenia.
źródło
Tak, powiedziałbym, że rozumiesz całkowicie poprawnie. Ten artykuł ( zarchiwizowany ) dość dobrze wyjaśnia uzasadnienie tego projektu. To chyba najważniejszy akapit:
źródło
Nawet jeśli jest to stary wątek, pomyślałem, że podzielę się pomysłem, jak wykorzystać więcej niż jeden rdzeń w aplikacji Node.JS. Jak wspomniał Nuray Altin - JXcore to potrafi.
Prosty przykład:
Domyślnie są dwa wątki (możesz to zmienić za pomocą
jxcore.tasks.setThreadCount()
)Oczywiście z zadaniami można zrobić znacznie więcej. Dokumenty są tutaj .
Kilka artykułów na ten temat:
źródło
Ponieważ to pytanie zadano prawie 2 lata temu. Sytuacja się zmienia lub istnieją alternatywne podejścia do problemu wielowątkowości w Node.JS
Zgodnie z poniższym postem na blogu, korzystając z nadchodzącego rozszerzenia „task”, niektórzy mogą bezpośrednio korzystać z innych dostępnych rdzeni.
http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html
źródło
Node.js jest aplikacją jednowątkową, ale może obsługiwać współbieżność poprzez koncepcję zdarzeń i wywołań zwrotnych. Oto wideo autorstwa Philipa Robertsa, które wyjaśnia, jak działają pętle zdarzeń w javascript.
Kliknij tu, aby zobaczyć film
(Zamiast interfejsów WebAPI w Node.js są C ++ API)
źródło