Node.js-in hadisə idarəedici memarlığı ilə digər dillərdə çoxqütblü proqramlaşdırma arasındakı fərq nədir?


cavab 1:

Həm hadisəyə əsaslanan, həm də çox dişli paradiqmalarda kod bir əməliyyat sistemi prosesində yerinə yetirilir.

Proses birdən çox mövzuya keçərsə, bu mövzular oxumaq və yazmaq üçün proses yaddaşını (ünvan sahəsi) bölüşür.

Node.js-i idarə edən JavaScript, əslində tək yivlidir. Hər bir funksiyanın tam yerinə yetirilməsinə zəmanət verilir və bu funksiyanın icrası zamanı cari müddətdə başqa heç bir JavaScript kodu yerinə yetirilmir. Təbii olaraq asinxron hadisələr (şəbəkə, disk giriş / çıxış, timer, digər aparat və əməliyyat sistemi hadisələri) mühərrik tərəfindən işlənir, bu hadisələr üçün icraedicilər (və ya geri çağırışlar) kimi qeydə alınmış JavaScript funksiyalarını icra ediləcək hadisə döngəsi növbəsinə əlavə edir. növbə bitməmişdən əvvəl.

Çox yivli paradiqmada, iki və ya daha çox mövzu paralel olaraq kodu yerinə yetirir ki, funksional bir çalışma zamanı fərqli bir prosessor nüvəsində fərqli bir kod parçası da eyni yaddaş adreslərini oxuyub yaza bilər. Kod, paylaşılan yaddaşa girişi idarə etmək üçün xüsusi əməliyyat sistemi mexanizmlərindən (sinxronizasiya primitivləri) istifadə etmədiyi halda uyğunsuz bir yaddaş vəziyyətinə səbəb ola bilər.



cavab 2:

Yaxşı bir sual budur: "Node.j'in hadisəyə yönəlmiş arxitekturası ilə digər dillərdə çoxfunksiyalı proqramlaşdırma arasında nə fərq var?"

Bunu biraz azalda bilərik və etməliyik.

  • Düyünün hadisəyə əsaslanan arxitekturası

Tədbirə əsaslanan memarlıq yalnız qovşaqlar üçün nəzərdə tutulmur, məsələn B. Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (çox dil).

  • Digər dildə multithread proqramlaşdırma.

Qeyd edək ki, JavaScript birdən çox mövzuya dəstək vermir. Bu, mənim bildiyimə görə mövzu kimi çıxış edə bilən veb işçilərini dəstəkləyir.

Buna görə hadisə idarəediciləri yalnız qovşaqlarda mövcud deyil və qovşaqlarda çox oxunuş da edilə bilər.

Beləliklə, iki sual ola bilər: "Hadisə ilə çox oxlu arasında fərq nədir" və "Düyün və digər dillər (çərçivələr) arasındakı fərq nədir". Bu sualın niyyəti kimi göründüyü üçün sonuna diqqət yetirəcəyəm.

Node ilə əlaqəli xüsusi şey, müəllifin veb tətbiqləri qurarkən I / O blok etməməsi üçün yaratmasıdır. Düyün icmasının mədəniyyəti, bloklanmayan I / O gücünü vurğulamaq və qurmaqdır. Zəngləri bloklayan çox sayda üçüncü kitabxananı tapa bilməzsiniz. Node istifadə edən bir inkişaf etdirici olaraq, kodunuzdakı incə tıxanmalarla qarşılaşmağınız çətin deyil. Digər dillərdə, sadəlövh bir geliştirici təsadüfən çox təsirsiz bir blok çağırışları edə bilər, məsələn B. Bir verilənlər bazası bağlantısından oxumaq.

Deyilənə görə, çox "paralellik" modelləri haqqında daha çox oxumalı və hər birinin üstünlük və eksikliklərini anlamalısınız. Nə üçün çox oxunuşun bu qədər uzun müddətə məqbul olduğunu qəbul etmək üçün bonus xalları.



cavab 3:

Konseptual fərqlər başın ətrafında sarılmaq olduqca sadədir.

Tədbirə əsaslanan arxitekturada, proqramınız davamlı tək yivli bir döngədə işləyir (node-da birdən çox iplik edə bilərsiniz, ancaq bu anda narahat olmağınız lazım deyil). Bir hadisə baş verdikdə, proqramın boş vaxtında işlənən zəng yığımında bir iş var.

Çox dişli arxitektura ümumiyyətlə bir hərəkət gözləmək məcburiyyətində qaldıqda yeni bir ip çıxarır. Beləliklə, bir verilənlər bazasına gedəcəksiniz və bütün zəruri işləri yerinə yetirən və orijinal ipi tamamlamaq və ya yenidən qoşulmaq üçün lazımi addımlar atan yeni bir mövzu yaradırsınız.

Hər iki üsul müxtəlif məqsədlər üçün çox faydalıdır. Hadisə idarəedicisi istifadəçi interfeysi və serverləri üçün əladır, çünki proqramınız yeni bir hadisənin baş verdiyini və hadisələrin tez-tez baş verdiyini bilmir. Bir problemi daha kiçik hissələrə bölmək istədiyiniz (və ya tək ipinizin döngəsinin həddinə yaxınlaşmaq istədiyiniz) hesablama intensiv iş üçün iplik tələb olunur.