Jaka jest różnica między architekturą opartą na zdarzeniach Node.js a programowaniem wielowątkowym w innych językach?


Odpowiedź 1:

Zarówno w paradygmacie sterowanym zdarzeniami, jak i wielowątkowym kod działa w procesie systemu operacyjnego.

Gdy proces uruchamia wiele wątków, wątki te współużytkują pamięć procesu (przestrzeń adresową) zarówno do odczytu, jak i zapisu.

JavaScript, który obsługuje Node.js, jest z założenia jednowątkowy. Każda funkcja działa do końca i żaden inny kod JavaScript w bieżącym procesie nie będzie działał podczas tej funkcji. Naturalnie asynchroniczne zdarzenia (sieć, dane wejściowe / wyjściowe dysku, zegary, inne zdarzenia sprzętowe i systemowe) są obsługiwane przez silnik, który dodaje funkcje JavaScript zarejestrowane jako programy obsługi (lub wywołania zwrotne) tych zdarzeń do kolejki pętli zdarzeń, która ma zostać wykonana po funkcje przed kolejką zostały zakończone.

W paradygmacie wielowątkowym dwa lub więcej wątków uruchamia kod równolegle, więc podczas działania funkcji inny kawałek kodu może również działać na innym rdzeniu procesora, prawdopodobnie odczytując lub zapisując na te same adresy pamięci. Może to spowodować niespójny stan pamięci, chyba że kod użyje specjalnych mechanizmów systemu operacyjnego (operacji podstawowych synchronizacji) do zarządzania dostępem do pamięci współużytkowanej.



Odpowiedź 2:

To dobre pytanie: „Jaka jest różnica między architekturą opartą na zdarzeniach Node.js a programowaniem wielowątkowym w innych językach?”.

Możemy i powinniśmy to trochę zepsuć.

  • Architektura sterowana zdarzeniami w węźle.

Architektura sterowana zdarzeniami nie jest wyłączna dla Node, np. Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (wiele języków).

  • Programowanie wielowątkowe w innych językach.

Pamiętaj, że JavaScript z założenia nie obsługuje wielu wątków. Chociaż obsługuje webmasterów, które, o ile mi wiadomo, mogą funkcjonować jako wątki.

W związku z tym sterowanie zdarzeniami nie jest unikalne dla Węzła, a w Node można wykonywać wielowątkowość.

Mogą więc pojawić się dwa pytania: „Jaka jest różnica między sterowaniem zdarzeniem a wielowątkowością” oraz „Jaka jest różnica między węzłem a innymi językami (frameworkami)”. Skoncentruję się na tym drugim, ponieważ wydaje się, że taka jest intencja pytania.

Powiedziałbym, że tym, co wyróżnia Node, jest to, że autor go utworzył, aby uniknąć blokowania IO podczas tworzenia aplikacji internetowych. Kultura społeczności Node polega na podkreślaniu i rozwijaniu siły nieblokującego IO. Nie znajdziesz zbyt wielu bibliotek zewnętrznych, które wykonują blokujące połączenia. Jako programista korzystający z Node, prawdopodobnie nie napotkasz subtelnych operacji blokujących w swoim kodzie. Podczas gdy w innych językach naiwny programista może przypadkowo wykonać bardzo nieefektywne blokowanie połączeń, takich jak odczyt z połączenia z bazą danych.

Poza tym powinieneś naprawdę przeczytać o wielu modelach „współbieżności” i zrozumieć zalety i wady każdego z nich. Punkty bonusowe za docenienie, dlaczego wielowątkowość była akceptowalna przez tak długi czas.



Odpowiedź 3:

różnice pojęciowe są dość łatwe do obejrzenia.

W architekturze sterowanej zdarzeniami program działa w ciągłej pętli jednowątkowej (możesz wykonywać kilka wątków w węźle, ale nie martw się o to teraz). Kiedy wydarzenie się uruchamia, na stosie połączeń jest zajęte zadanie, które należy zająć w czasie wolnym od programów.

Architektura wielowątkowa generalnie wysyła nowy wątek, gdy musi on czekać na akcję. Nawiązujesz więc połączenie z bazą danych i rozpędzasz nowy wątek, który wykona wszystkie potrzebne czynności i zrobi wszystko, czego potrzebujesz, i zakończy lub powróci do pierwotnego wątku.

Obie te metody są bardzo przydatne do różnych rzeczy. Sterowany zdarzeniami jest świetny dla interfejsu użytkownika i serwerów, ponieważ Twój program nie wie, kiedy zdarzy się nowy, a często zdarza się, że następuje seria. Podczas gdy wątkowanie jest konieczne w przypadku zadań wymagających dużej mocy obliczeniowej, w których chcesz rozbić problem na znacznie mniejsze części (lub zbliżasz się do limitu pojedynczej pętli wątkowej).