Perché node.js è asincrono?

Nessuno in realtà ha chiesto questo (da tutti i “suggerimenti” che sto ricevendo e anche dalla ricerca prima di chiederlo qui).

Allora, perché node.js è asincrono?

Da quanto ho dedotto dopo alcune ricerche:

Linguaggi come PHP e Python sono linguaggi di scripting (potrei sbagliarmi sulle lingue attuali che sono linguaggi di scripting) mentre JavaScript non lo è. (Suppongo che questo derivi dal fatto che JS non compila?)

Node.js viene eseguito su un singolo thread mentre i linguaggi di scripting utilizzano più thread.

Asincrono significa stateless e che la connessione è persistente mentre synchronous è (quasi) opposto.

Forse la risposta si trova da qualche parte sopra, ma non sono ancora sicuro.

La mia seconda e ultima domanda relativa a questo argomento è questa:

JavaScript può essere realizzato in un linguaggio sincrono?

PS. So che alcuni di voi chiederanno “perché vorresti creare JS sincrono?” nelle tue risposte, ma la verità è che non lo faccio. Sto solo facendo questo tipo di domande perché sono sicuro che ci sono più persone là fuori che solo me stesso che hanno pensato a queste domande.

Node.js viene eseguito su un singolo thread mentre i linguaggi di scripting utilizzano più thread.

Non tecnicamente. Node.js utilizza diversi thread, ma solo un thread di esecuzione. I thread in background sono per trattare con IO per rendere tutto il lavoro di asincronia. Affrontare efficacemente i thread è un vero problema, quindi la prossima opzione migliore è eseguire in un ciclo di eventi in modo che il codice possa essere eseguito mentre i thread in background sono bloccati su IO.

Asincrono significa stateless e che la connessione è persistente mentre synchronous è (quasi) opposto.

Non necessariamente. È ansible mantenere lo stato in un sistema asincrono abbastanza facilmente. Ad esempio, in Javascript, è ansible utilizzare bind() per associare un object a una funzione, preservando così lo stato in modo esplicito quando la funzione restituisce:

 function State() { // make sure that whenever doStuff is called it maintains its state this.doStuff = this.doStuff.bind(this); } State.prototype.doStuff = function () { }; 

Asincrono significa non aspettare che un’operazione finisca, ma invece registrare un listener. Questo accade sempre in altre lingue, in particolare qualsiasi cosa che debba accettare input da parte dell’utente. Ad esempio, in una GUI Java, non si blocca in attesa che l’utente prema un pulsante, ma si registra un listener con la GUI.

La mia seconda e ultima domanda relativa a questo argomento è questa:

JavaScript può essere realizzato in un linguaggio sincrono?

Tecnicamente, tutte le lingue sono sincrone, anche Javascript. Tuttavia, Javascript funziona molto meglio in un design asincrono perché è stato progettato per essere a thread singolo.

Fondamentalmente ci sono due tipi di programmi:

  • Limite della CPU: l’unico modo per farlo andare più veloce è ottenere più tempo per la CPU
  • I limiti IO trascorrono molto tempo nell’attesa dei dati, quindi un processore più veloce non avrà importanza

I videogiochi, i numeri crunch e i compilatori sono vincolati alla CPU, mentre i server Web e le GUI sono generalmente vincolati all’IO. Javascript è relativamente lento (a causa di quanto sia complesso), quindi non sarebbe in grado di competere in uno scenario legato alla CPU (credetemi, ho scritto la mia giusta parte di Javascript con CPU).

Invece di programmare in termini di classi e oggetti, Javascript si presta alla codifica in termini di semplici funzioni che possono essere messe insieme. Questo funziona molto bene nella progettazione asincrona, perché gli algoritmi possono essere scritti per elaborare i dati in modo incrementale così come sono. IO (in particolare IO di rete) è molto lento, quindi c’è un po ‘di tempo tra i pacchetti di dati.

Esempio

Supponiamo che tu abbia 1000 connessioni live, ciascuna che consegna un pacchetto ogni millisecondo, e l’elaborazione di ogni pacchetto richiede 1 microsecondo (molto ragionevole). Supponiamo inoltre che ogni connessione invii 5 pacchetti.

In un’applicazione sincrona a thread singolo, ciascuna connessione verrà gestita in serie. Il tempo totale impiegato è (5 * 1 + 5 * .001) * 1000 millisecondi o ~ 5005 millisecondi.

In un’applicazione asincrona a thread singolo, ciascuna connessione verrà gestita in parallelo. Poiché ogni pacchetto richiede 1 millisecondo e l’elaborazione di ogni pacchetto richiede 0,001 millisecondi, possiamo elaborare ogni pacchetto di connessione tra i pacchetti, quindi la nostra formula diventa: 1000 * .001 + 5 * 1 millisecondi o ~ 6 millisecondi.

La soluzione tradizionale a questo problema era creare più thread. Questo risolve il problema di I / O, ma quando il numero di connessioni aumentava, così l’uso della memoria (i thread costano molta memoria) e l’utilizzo della CPU (il multiplexing di 100 thread su 1 core è più difficile di 1 thread su 1 core).

Tuttavia, ci sono aspetti negativi. Se la tua applicazione web ha anche bisogno di fare un po ‘di numeri pesanti, tu sei SOL perché mentre stai scricchiolando i numeri, le connessioni devono aspettare. Threading risolve questo perché il sistema operativo può scambiare l’attività che richiede molta CPU quando i dati sono pronti per un thread in attesa su IO. Inoltre, node.js è associato a un singolo core, quindi non è ansible sfruttare il processore multi-core a meno che non si creino più istanze e richieste proxy.

Javascript non si compila in nulla. È “valutato” in fase di esecuzione, proprio come PHP e Ruby. Quindi è un linguaggio di scripting proprio come PHP / Ruby. (il suo nome ufficiale è in realtà ECMAScript).

Il “modello” a cui fa riferimento Node è leggermente diverso da PHP / Ruby. Node.js utilizza un ‘event loop’ (il singolo thread) che ha l’unico objective di prendere le richieste di rete e gestirle molto rapidamente, e se per qualsiasi motivo incontra un’operazione che richiede un po ‘di tempo (richiesta API, query database – praticamente tutto ciò che coinvolge IO (input / output)) lo passa a un thread di “worker” in background e si spegne per fare qualcos’altro mentre il thread worker attende il completamento del task lungo. Quando ciò accade, il “ciclo degli eventi” principale prenderà i risultati e continuerà a gestirli.

PHP / Ruby seguendo un modello di threading. In sostanza, per ogni richiesta di rete in arrivo, il server delle applicazioni esegue il filing di un thread o processo isloated per gestire la richiesta. Questo non si adatta enormemente e l’approccio di Node è citato come uno dei suoi punti di forza principali rispetto a questo modello.

Asincrono significa stateless e che la connessione è persistente mentre synchronous è (quasi) opposto.

No. Le istruzioni sincrone sono completate in un ordine naturale, dal primo all’ultimo. Le istruzioni asincrone indicano che se un passo nel stream di un programma richiede un tempo relativamente lungo, il programma continuerà le operazioni di esecuzione e tornerà semplicemente a questa operazione una volta completato.

JavaScript può essere realizzato in un linguaggio sincrono?

Alcune operazioni in JavaScript sono sincrone. Altri sono asincroni. Per esempio:

Operazioni di blocco:

 for(var k = 0; k < 1; k = k - 1;){ alert('this will quickly get annoying and the loop will block execution') alert('this is blocked and will never happen because the above loop is infinite'); 

asincrono:

 jQuery.get('/foo', function (result) { alert('This will occur 2nd, asynchronously'); }); alert('This will occur 1st. The above operation was skipped over and execution continued until the above operation completes.'); 

JavaScript può essere realizzato in un linguaggio sincrono?

Javascript non è un “linguaggio asincrono”; piuttosto, node.js ha molte API asincrone. L’asincrona è una proprietà dell’API e non della lingua. La facilità con cui le funzioni possono essere create e passate in javascript rende conveniente passare le funzioni di callback, che è un modo per gestire il stream di controllo in un’API asincrona, ma non c’è nulla di intrinsecamente asincrono su javascript . Javascript può supportare facilmente le API sincrone.

Perché node.js è asincrono?

Node.js favorisce le API asincrone perché è a thread singolo. Ciò consente di gestire in modo efficiente le proprie risorse, ma richiede che le operazioni di lunga durata siano non bloccanti e che le API asincrone siano un modo per consentire il controllo del stream con molte operazioni non bloccanti.