Kāda ir atšķirība starp Node.js notikumu vadīto arhitektūru un daudzpavedienu programmēšanu citās valodās?


Atbilde 1:

Gan notikumu virzītā, gan vairāku pavedienu paradigmā kods darbojas operētājsistēmas procesā.

Kad process palaiž vairākus pavedienus, šie pavedieni koplieto procesa atmiņu (adreses vietu) gan lasīšanai, gan rakstīšanai.

JavaScript, kas darbina Node.js, ir izstrādāts ar vienu vītni. Katrai funkcijai tiek garantēts, ka tā tiek pabeigta, un šīs funkcijas izpildes laikā netiks palaists neviens cits JavaScript kods pašreizējā procesā. Dabiski asinhronos notikumus (tīkla, diska ievades-izvades, taimerus, citu aparatūras un operētājsistēmas notikumus) pārvalda motors, kas pievieno JavaScript funkcijas, kas reģistrētas kā šo notikumu apstrādātāji (vai atzvanīšanas), notikumu cilpas rindā, kas jāizpilda pēc ir pabeigtas rindas priekšā esošās funkcijas.

Vairāku vītņu paradigmā divi vai vairāki pavedieni darbojas kodu paralēli, tāpēc funkciju izpildes laikā cits koda gabals var darboties arī citā procesora kodolā, iespējams, lasot vai rakstot uz tām pašām atmiņas adresēm. Tas var izraisīt nevienmērīgu atmiņas stāvokli, ja vien kods neizmanto īpašus operētājsistēmas mehānismus (sinhronizācijas primitīvus), lai pārvaldītu piekļuvi koplietotajai atmiņai.



Atbilde 2:

Šis ir labs jautājums: "Kāda ir atšķirība starp Node.js notikumu vadīto arhitektūru un daudzpavedienu programmēšanu citās valodās?"

Mēs to varam un mums vajadzētu mazliet nojaukt.

  • Mezgla notikumu vadīta arhitektūra.

Notikumu balstīta arhitektūra nav ekskluzīva mezgliem, piemēram, Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (vairākas valodas).

  • Vairāku vītņu programmēšana citās valodās.

Ņemiet vērā, ka JavaScript pēc konstrukcijas neatbalsta vairākus pavedienus. Lai gan tas atbalsta tīmekļa darbiniekus, kuri, cik es zinu, var darboties kā pavedieni.

Tātad notikumu virzīts nav vienīgais mezglam, un mezglu var veikt vairāku pavedienu veidošanā.

Tātad šeit var būt divi jautājumi: “Kāda ir atšķirība starp notikumu vadītu un vairāku pavedienu pavedieniem” un “Kāda ir atšķirība starp mezglu un citām valodām (ietvariem)”. Es koncentrēšos uz pēdējo, jo tas, šķiet, ir jautājuma mērķis.

Es teiktu, ka mezglu padara īpašu, jo autors to izveidoja ar mērķi izvairīties no IO bloķēšanas, veidojot tīmekļa lietojumprogrammas. Mezglu kopienas kultūra ir uzsvērt un bloķēt IO stiprināšanas spējas. Jūs neatradīsit pārāk daudz trešo pušu bibliotēku, kas veic zvanu bloķēšanu. Kā izstrādātājs, kurš izmanto Node, jūs, visticamāk, nedarbosities smalkas bloķēšanas darbības savā kodā. Tā kā citās valodās naivs izstrādātājs nejauši var veikt ļoti neefektīvus zvanu bloķēšanu, piemēram, lasīšanu no datu bāzes savienojuma.

Izņemot to, jums patiešām vajadzētu izlasīt par vairākiem “vienlaicīguma” modeļiem un saprast katra plusus un mīnusus. Bonusa punkti par novērtējumu, kāpēc vairāku pavedienu ieviešana bija pieņemama tik ilgu laiku.



Atbilde 3:

konceptuālās atšķirības ir diezgan viegli aptīt galvu.

Uz notikumiem balstītā arhitektūrā jūsu programma darbojas nepārtrauktā vienas vītnes cilpā (mezglā varat veikt vairākus pavedienus, bet šobrīd par to neuztraucieties). Kad notikums aizdegas, darbs ir pie sarunu paketes, kas jārisina programmās brīvajā laikā.

Vairāku vītņu arhitektūra parasti nosūta jaunu pavedienu, kad tai jāgaida darbība. Tātad, jūs piezvanāt uz datu bāzi un izveidojat jaunu pavedienu, kas veiks visas nepieciešamās lietas un darīs visu nepieciešamo un noslēdzīs vai atkal pievienosies sākotnējam pavedienam.

Abas šīs metodes ir ļoti noderīgas dažādās lietās. Notikumu vadīti ir lieliski piemēroti lietotāja saskarnei un serveriem, jo ​​jūsu programma nezina, kad notiks jauns notikums, un bieži vien notikumi tiks pārrauti. Kaut arī vītne ir nepieciešama skaitļošanas ziņā smagiem darbiem, kur vēlaties sadalīt problēmu daudz mazākos gabalos (vai jūs tuvojaties vienas vītnes cilpas robežai).