Vad är skillnaden mellan Node.js 'händelsedrivna arkitektur och multigängad programmering på andra språk?


Svar 1:

Både i det händelsestyrda och det flertrådiga paradigmet körs koden i en operativsystemprocess.

När processen kör flera trådar delar dessa trådar processminnet (adressutrymmet) både för läsning och skrivning.

JavaScript som driver Node.js är entrådad av design. Alla funktioner garanteras att köras till slut, och ingen annan JavaScript-kod i den aktuella processen kommer att köras under den funktionen körs. De naturligtvis asynkrona händelserna (nätverk, hårddiskinmatning, timers, annan hårdvaru- och operativsystemhändelser) hanteras av motorn som lägger till JavaScript-funktioner som är registrerade som hanterare (eller återuppringningar) för dessa händelser till händelsekupkön som ska utföras efter funktionerna framför kön är klar.

I det flertrådiga paradigmet kör två eller flera trådar kod parallellt, så under en funktionsuppgång kan en annan kodbit också köras på en annan processorkärna, eventuellt läsa eller skriva till samma minnesadresser. Detta kan leda till ett inkonsekvent minne i minnet om inte speciella operativsystemmekanismer (synkroniseringsprimitiv) används av koden för att hantera åtkomst till det delade minnet.



Svar 2:

Det här är en bra fråga, "Vad är skillnaden mellan Node.js 'händelsestyrda arkitektur och flertrådad programmering på andra språk?".

Vi kan och bör bryta ned detta lite.

  • Nodes händelsestyrda arkitektur.

Händelsedriven arkitektur är inte exklusiv för Node, t.ex. Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (flera språk).

  • Multigängad programmering på andra språk.

Observera att JavaScript, genom design, inte stöder flera trådar. Även om det stöder webbarbetare, som så vitt jag vet kan fungera som trådar.

Så händelsestyrd är inte unik för Node och flera trådar kan göras i Node.

Så det kan finnas två frågor här: "Vad är skillnaden mellan händelsestyrd kontra multtrådning" och "Vad är skillnaden mellan Node och andra språk (ramar)". Jag kommer att fokusera på det senare eftersom det verkar vara avsikten med frågan.

Jag säger att det som gör Node speciellt är att författaren skapade den i syfte att undvika att blockera IO när man bygger webbapplikationer. Kulturen i Node community är att betona och bygga på styrkan i icke-blockerande IO. Du kommer inte hitta för många tredjepartsbibliotek som utför blockerande samtal. Som utvecklare som använder Node är det troligt att du kommer att stöta på subtila blockeringsoperationer i din kod. Medan på andra språk kan en naiv utvecklare av misstag utföra mycket ineffektiva blockeringssamtal som att läsa från en databasanslutning.

Annars än så bör du verkligen läsa om flera modeller för ”samtidighet” och förstå fördelarna och nackdelarna med var och en. Bonuspoäng för att uppskatta varför flergängning var acceptabel under så lång tid.



Svar 3:

de begreppsmässiga skillnaderna är ganska enkla att slå runt huvudet.

I händelsestyrd arkitektur körs ditt program i en kontinuerlig enkeltrådig slinga (du kan göra lite trådtråd i noden men oroa dig inte för det just nu). När en händelse skjuter upp, är ett jobb uppe i samtalstacken som ska hanteras på programmets fritid.

Flertrådad arkitektur skickar vanligtvis en ny tråd när den måste vänta på en åtgärd. Så du ringer till en databas och du snurrar upp en ny tråd som kommer att utföra allt du behöver och göra vad du behöver för att avsluta eller återgå i originaltråden.

Båda dessa metoder är mycket användbara för olika saker. Händelsedrivet är bra för användargränssnitt och servrar eftersom ditt program inte vet när ett nytt jämnt kommer att hända och ofta kommer händelser att brista. Även om trådning är nödvändig för beräkningstunga jobb där du vill dela upp ett problem i mycket mindre bitar (eller när du närmar dig gränsen för din enda gängade slinga).