Каква е разликата между управляваната от събития архитектура на Node.js и многопоточното програмиране на други езици?


Отговор 1:

Както в събитие, така и в многопоточната парадигма кодът работи вътре в процеса на операционна система.

Когато процесът изпълнява множество нишки, тези нишки споделят процесната памет (адресно пространство) както за четене, така и за писане.

JavaScript, който задейства Node.js, е с една нишка по дизайн. Гарантирано е, че всяка функция се изпълнява до завършване и по време на изпълнението на тази функция няма да се изпълнява друг JavaScript код в текущия процес. Естествено асинхронните събития (мрежа, диск-вход-изход, таймери, друг хардуер и събития на операционната система) се обработват от двигателя, който добавя функциите на JavaScript, регистрирани като обработващи (или обратни обаждания) за тези събития, в опашката за цикъл на събития, която ще бъде изпълнена след функциите пред опашката са приключили.

В парадигмата с много нишки две или повече нишки изпълняват паралелно код, така че по време на изпълнение на функция различен код може да се изпълнява и в различно ядро ​​на процесора, евентуално четене или запис на същите адреси на паметта. Това може да доведе до непоследователно състояние на паметта, освен ако кода не се използват специални механизми на операционната система (примитиви за синхронизация) за управление на достъпа до споделената памет.



Отговор 2:

Това е добър въпрос, "Каква е разликата между управляваната от събития архитектура на Node.js и многопоточното програмиране на други езици?".

Можем и трябва да разбием това малко.

  • Възелна архитектура, управлявана от събития

Архитектурата, управлявана от събития, не е изключителна за Node, например Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (няколко езика).

  • Програмиране с много нишки на други езици.

Обърнете внимание, че JavaScript по дизайн не поддържа множество нишки. Макар че поддържа уебработници, които, доколкото знам, могат да функционират като нишки.

Така управляваните от събития не са уникални за Node и може да се направи многократно нанизване в Node.

Така че тук могат да възникнат два въпроса: „Каква е разликата между задвижваните от събития спрямо многоредовете“ и „Каква е разликата между Node и други езици (рамки)“. Ще се съсредоточа върху последното, тъй като това изглежда е намерението на въпроса.

Бих казал, че това, което прави Node специално, е, че авторът го е създал с цел да избегне блокирането на IO при изграждането на уеб приложения. Културата на Node общността е да се акцентира и да се надгражда върху силата на блокиране на IO. Няма да намерите твърде много библиотеки на трети страни, които извършват блокиране на обаждания. Като разработчик, използващ Node, е малко вероятно да се сблъскате с фини блокиращи операции във вашия код. Докато на други езици, наивен разработчик може случайно да извърши силно неефективно блокиране на обаждания като четене от връзка с база данни.

Освен всичко това, наистина трябва да прочетете за множество модели за „едновременност“ и да разберете плюсовете и минусите на всеки. Бонус точки за оценяване защо многократното нанизване е приемливо за толкова дълго време.



Отговор 3:

концептуалните разлики са доста лесни за увиване на главата.

В архитектурата, управлявана от събития, вашата програма работи в непрекъснат цикъл с единична резба (можете да направите няколко мулти резба в възел, но не се притеснявайте за това в момента). Когато събитието стартира, в стека за разговори е задание, което трябва да се работи в свободното време на програмите.

Многопоточната архитектура обикновено изпраща нова тема, когато трябва да изчака дадено действие. Така че, вие се обаждате към база данни и въртите нова тема, която ще изпълни всички неща, от които се нуждаете, и ще направи това, което трябва, и да заключи или да се присъедини към първоначалната тема.

И двата метода са много полезни за различни неща. Задвижването на събитията е чудесно за потребителския интерфейс и сървърите, защото вашата програма не знае кога ще се случи нов дори и често събитията ще се появят. Докато резбата е необходима за изчислително тежки задачи, при които искате да разделите проблем на много по-малки парчета (или наближавате лимита на вашата единична резба).