2016-09-20 25 views
6

Wcześniej szukałem większej różnicy między współbieżnością i paralelizmem. Natknąłem się na rozmowę na YouTube podaną przez Roba Pike'a mówiącą o różnicach między współbieżnością i paralelizmem. Jego wykład był w kontekście języka Google Go. Z tego, co rozumiem, współbieżność to projekt radzenia sobie z wieloma rzeczami, ale równoległość jest fizyczną realizacją wielu rzeczy w tym samym czasie.Czy Node.js obsługuje paralelizm?

Z tego co rozumiem, Node.js działa jako pojedynczy wątek. Więc chociaż Node wspiera współbieżność ze sposobem, w jaki implementuje wywołania zwrotne i takie, czy ma możliwość obsługi równoległego wykonywania zadań? Czy można go skonfigurować do uruchamiania wielu wątków na oddzielnych procesorach?

Odpowiedz

4

Węzeł może obsługiwać „Równo- ległości” poprzez ani w Cluster lub child_process modułów pakowanych w API Nodejs podstawowej. Oba moduły tworzą dodatkowe procesy, a nie dodatkowe wątki.

Wątki są tworzone i zarządzane, czasami w puli, "pod maską" przez libuv, która node implementuje i wykorzystuje do wykonywania operacji asynchronicznych, takich jak odczyt z pliku. Nie można jawnie utworzyć wątku z wykonywanego skryptu JavaScript. Możesz przeczytać więcej o libuv w poniższych zasobów

Ponadto, jest to wielkie pytanie na Threads and Pooling który ma wiele szczegółów.

Cluster służy do rozdzielania obciążenia serwera na wiele rdzeni i nadal udostępnia im port. Jednak Cluster używa pod maską child_process.fork() i komunikuje się przez inter-process communication. Możesz przeczytać więcej o Cluster in the Nodejs Core API Docs.

child_process oferuje kilka różnych sposobów parallelize pracy poprzez exec(), spawn() lub fork(). Proces macierzysty może komunikować się z procesem podrzędnym za pomocą komunikacji między procesami za pośrednictwem potoków.

Zasadniczo węzeł chce, aby użytkownik wykorzystał the event loop i pozostawił zarządzanie wątkami na libuv. Dlatego tak łatwo jest zbudować kod, który zazwyczaj wymaga blokowania i bezpieczeństwa wątków. Jeśli musisz wykonywać prace wymagające ciężkiego podnoszenia lub znaczną ilość pracy blokującej (synchronicznej), możesz użyć child_process, aby odciążyć tę pracę. Jeśli chcesz skalować aplikację internetową w rdzeniach, użyj Cluster.

+0

Odniosłem wrażenie, że istniała co najmniej [w jedną stronę] (https://www.npmjs.com/package/webworker-threads), aby utworzyć wiele przepływów wykonawczych, które mogą działać równocześnie, komunikując się, przekazując wiadomości do wzajemnie. Czy tak nie jest? –

+1

@DavidSchwartz, nie masz racji, to podejście może używać 'child_process' i implementować przekazywanie wiadomości z zdarzeniem' child_process.on ('message') 'w procesie nadrzędnym i funkcją' process.send() 'w podrzędnym procesie proces. Chciałem również ograniczyć moją odpowiedź na to, co zapewnia Node.js w ramach jego podstawowej funkcjonalności, a nie jakie pakiety mogą potencjalnie zapewnić. – peteb

0

Jeśli się nie mylę, szukasz czegoś podobnego do wielowątkowości i/lub liczenia wielu rzeczy w tym samym czasie.

Wiele egzekucje naraz
SIMD zaczyna się znaleźć drogę do przeglądarek, z wdrożeń węzeł nie daleko w tyle. Spójrz na node-simd lub MDN SIMD (browsers). SIMD jest wciąż eksperymentalna i działa tylko na obsługiwanych procesorach (oczywiście, ponieważ nie wszystkie procesory mają tę funkcjonalność). Wykonuje wiele rzeczy naraz, przykład porównując do normalnych JS SIMD JS byłoby:

// Normal addition, 4 actions are executed. 
var a = [1, 2, 3, 4]; 
var b = [5, 6, 7, 8]; 
var c = []; 

c[0] = a[0] + b[0]; 
c[1] = a[1] + b[1]; 
c[2] = a[2] + b[2]; 
c[3] = a[3] + b[3]; 
c; // Array[6, 8, 10, 12] 

// SIMD execution - all additions are processed simultaenously through the CPU 
var a = SIMD.Float32x4(1, 2, 3, 4); 
var b = SIMD.Float32x4(5, 6, 7, 8); 
var c = SIMD.Float32x4.add(a,b); 
c; // Float32x4[6, 8, 10, 12] 

Wielowątkowość
W odniesieniu do wielowątkowości, webworkers istniały w środowisku przeglądarki na chwilę teraz. Zostało to całkowicie przeniesione do Węzła zgodnie ze specyfikacją HTML, jak widać in this repository.
Oto good explanation co do tego, dlaczego webworkers zostały nawet przeniesione do Węzła, ponieważ można już uruchamiać procesy potomne w innych wątkach i na innych procesorach z modułem child_process. node-webworker to świetny moduł, ponieważ każdy proces jest uruchamiany w ramach kontekstu on i w swoim własnym procesie node, więc jest naprawdę wielowątkowy z węzłem.

Aby uruchomić różne procesy na różnych procesorach, należy zastosować node-webworker lub użyć child_process w celu odrodzenia innych wątków w celu wykonania osobnych akcji w tym samym czasie z różnymi rdzeniami procesora. node-webworker może nasłuchiwać zdarzeń za pomocą znanego interfejsu API postMessage, a child_process będzie komunikować się przez stdin/stdout/stderr.

Mam nadzieję, że odpowiedzi na swoje pytanie :)