Hva er forskjellen mellom Node.js 'hendelsesstyrte arkitektur og flertrådd programmering på andre språk?


Svar 1:

Både i det hendelsesstyrte og det flertrådede paradigmet kjører koden i en operativsystemprosess.

Når prosessen kjører flere tråder, deler disse trådene prosessminnet (adresseplass) både for lesing og skriving.

JavaScript som driver Node.js, er enkelttrådet av design. Alle funksjoner er garantert å kjøre til fullførelse, og ingen annen JavaScript-kode i den nåværende prosessen vil kjøres i løpet av den funksjonen. De naturlig asynkrone hendelser (nettverk, diskinngang, tidtakere, annen maskinvare- og operativsystemhendelser) blir håndtert av motoren som legger til JavaScript-funksjonene som er registrert som håndterere (eller tilbakeringinger) for disse hendelsene i hendelsesløkkekøen som skal utføres etter funksjonene foran køen er ferdige.

I det flertrådede paradigmet kjører to eller flere tråder kode parallelt, så under en funksjonskjøring kan et annet stykke kode også kjøres på en annen prosessorkjerne, eventuelt lese eller skrive til de samme minneadressene. Dette kan resultere i en inkonsekvent tilstand av minnet med mindre spesielle operativsystemmekanismer (synkroniseringsprimitiver) brukes av koden for å administrere tilgang til det delte minnet.



Svar 2:

Dette er et godt spørsmål: "Hva er forskjellen mellom Node.js 'hendelsesstyrte arkitektur og flertrådd programmering på andre språk?".

Vi kan og bør bryte dette litt ned.

  • Nodes hendelsesstyrte arkitektur.

Hendelsesdrevet arkitektur er ikke eksklusiv for Node, for eksempel Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (flere språk).

  • Multetråd programmering på andre språk.

Merk at JavaScript, etter design, ikke støtter flere tråder. Selv om den støtter nettverkere, som så vidt jeg vet kan fungere som tråder.

Så hendelsesstyrt er ikke unikt for Node og multi-threading kan gjøres i Node.

Så det kan være to spørsmål her: "Hva er forskjellen mellom hendelsesdrevet vs flergjenger", og "Hva er forskjellen mellom Node og andre språk (rammer)". Jeg vil fokusere på sistnevnte siden det ser ut til å være intensjonen med spørsmålet.

Jeg vil si det som gjør Node spesiell, er at forfatteren opprettet den med det formål å unngå å blokkere IO når han bygger webapplikasjoner. Kulturen i Node-samfunnet er å understreke og bygge videre på styrken til ikke-blokkerende IO. Du kommer ikke til å finne for mange tredjepartsbiblioteker som utfører blokkerende samtaler. Som en utvikler som bruker Node, er det lite sannsynlig at du kommer til å få subtile blokkeringsoperasjoner i koden din. Mens på andre språk kan en naiv utvikler ved et uhell utføre svært ineffektive blokkerende samtaler som å lese fra en databaseforbindelse.

Annet enn det, bør du virkelig lese om flere modeller for "samtidighet" og forstå fordeler og ulemper ved hver enkelt. Bonuspoeng for å sette pris på hvorfor flergjenger var akseptabel i så lang tid.



Svar 3:

de konseptuelle forskjellene er ganske enkle å pakke hodet rundt.

I hendelsesstyrt arkitektur kjører programmet ditt i en kontinuerlig enkeltrådet loop (du kan gjøre flere multitråder i noden, men ikke bekymre deg for det akkurat nå). Når en hendelse avfyres, er en jobb oppe i samtalen som skal behandles på programmets fritid.

Flertrådet arkitektur sender vanligvis en ny tråd når den må avvente en handling. Så du ringer til en database og snurrer opp en ny tråd som vil utføre alle tingene du trenger og gjøre det du trenger for å avslutte eller gå sammen med den originale tråden igjen.

Begge disse metodene er veldig nyttige for forskjellige ting. Hendelsesdrevet er flott for brukergrensesnitt og servere fordi programmet ditt ikke vet når en ny part vil skje, og ofte vil hendelser komme i skader. Mens tråding er nødvendig for beregningsmessige tunge jobber der du vil dele opp et problem i mye mindre biter (eller når du nærmer deg grensen for den enkle gjengede sløyfen).