Hvad er forskellen mellem Node.js 'begivenhedsdrevne arkitektur og multi-threaded programmering på andre sprog?


Svar 1:

Både i det begivenhedsdrevne og det flertrådede paradigme kører koden i en operativsystemproces.

Når processen kører flere tråde, deler disse tråde proceshukommelsen (adresserum) både til læsning og skrivning.

JavaScript, der driver Node.js, er enkeltrådet efter design. Hver funktion er garanteret at køre til færdiggørelse, og ingen anden JavaScript-kode i den aktuelle proces vil køre under denne funktionskørsel. De naturligt asynkrone begivenheder (netværk, disk input-output, timere, andre hardware- og operativsystembegivenheder) håndteres af motoren, der tilføjer JavaScript-funktionerne, der er registreret som håndterere (eller tilbagekald) for disse begivenheder til den begivenhedsløkekø, der skal udføres efter funktionerne foran køen er afsluttet.

I det flertrådede paradigme kører to eller flere tråde kode parallelt, så under en funktionskørsel kan et andet stykke kode også køre på en anden processorkerne, eventuelt læse eller skrive til de samme hukommelsesadresser. Dette kan resultere i en inkonsekvent tilstand af hukommelsen, medmindre specielle operativsystemmekanismer (synkroniseringsprimitiver) bruges af koden til at styre adgangen til den delte hukommelse.



Svar 2:

Dette er et godt spørgsmål, "Hvad er forskellen mellem Node.js 'begivenhedsdrevne arkitektur og multi-threaded programmering på andre sprog?".

Vi kan og bør nedbryde dette lidt.

  • Nodes begivenhedsstyrede arkitektur.

Begivenhedsdrevet arkitektur er ikke eksklusiv for Node, f.eks. Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (flere sprog).

  • Multitrådet programmering på andre sprog.

Bemærk, at JavaScript, efter design, ikke understøtter flere tråde. Selvom det understøtter webarbejdere, som så vidt jeg ved kan fungere som tråde.

Så begivenhedsstyret er ikke unikt for knudepunkt, og multi-threading kan udføres i Node.

Så der kan være to spørgsmål her: "Hvad er forskellen mellem begivenhedsdrevet vs multitråde", og "Hvad er forskellen mellem Node og andre sprog (rammer)". Jeg vil fokusere på sidstnævnte, da det ser ud til at være hensigten med spørgsmålet.

Jeg siger, at det, der gør Node specielt, er, at forfatteren oprettede det med det formål at undgå at blokere IO, når man bygger webapplikationer. Kulturen i Node community er at understrege og bygge videre på styrken af ​​ikke-blokerende IO. Du vil ikke finde for mange tredjepartsbiblioteker, der udfører blokerende opkald. Som udvikler, der bruger Node, er det usandsynligt, at du kommer til at få subtile blokeringsoperationer i din kode. Mens der på andre sprog kan en naiv udvikler ved et uheld udføre meget ineffektive blokerende opkald som læsning fra en databaseforbindelse.

Bortset fra det, skal du virkelig læse om flere modeller for ”samtidighed” og forstå fordele og ulemper ved hver enkelt. Bonuspoint for at forstå, hvorfor multi-threading var acceptabel i så lang tid.



Svar 3:

de konceptuelle forskelle er temmelig nemme at vikle dit hoved rundt.

I hændelsesdrevet arkitektur kører dit program i en kontinuerlig enkelt trådet loop (du kan gøre nogle multi-threading i node, men du skal ikke bekymre dig om det lige nu). Når en begivenhed fyres, er et job op på opkaldsstakken, der skal behandles på programmets fritid.

Multi-threaded arkitektur sender normalt en ny tråd, når den skal afvente en handling. Så du ringer til en database, og du spinder op en ny tråd, der udfører alle de ting, du har brug for, og gør det, du har brug for, og afslutter eller genindgår i den originale tråd.

Begge disse metoder er meget nyttige til forskellige ting. Begivenhedsdrevet er fantastisk til brugergrænseflade og servere, fordi dit program ikke ved, hvornår en ny jævnhed vil ske, og ofte vil begivenheder komme i burst. Mens trådning er nødvendig til computertungt job, hvor du vil opdele et problem i meget mindre stykker (eller du nærmer dig grænsen for din enkelt gevindsløjfe).