Come funziona JS Promises come thread singolo

1

Javascript è single threaded. Quello che capisco da questo è se JS i in esecuzione su linea di codice consente di dire una funzione. Non può andare alla riga successiva a meno che quella funzione non sia stata rimossa dallo stack.

Detto questo, non capisco, come promettiamo di eseguire altri blocchi di codice lungo la strada, mentre l'interprete sta ancora risolvendo il codice di promessa.

Sono un noob in JS, quindi sto cercando di capire l'implementazione sottostante.

Ho visto un esempio di implementazione PHP di Promises e l'idea è che PHP possa eseguire il fork di un processo separato in un thread diverso che invia il segnale di ritorno al thread principale quando il codice asincrono è stato eseguito.

Funziona allo stesso modo in Javascript?

Grazie

    
posta Raheel Khan 02.09.2018 - 20:38
fonte

3 risposte

1

Parallelamente o fuori ordine o l'esecuzione asincrona non è realmente legata al numero di thread. Pensaci. Un singolo thread può ancora fare il cambio e fare le cose nello stesso tempo, a pezzi e pezzi. Come una CPU basata su software.

È davvero come viene implementata la piattaforma di esecuzione. Puoi avere l'illusione di tale elaborazione tramite una coda eventi e un singolo thread looper che funziona su quella coda.

In caso di motori JavaScript, si può pensare che per ogni operazione asincrona definita su qualsiasi riga nel codice sorgente, il motore non aspetti di completare tale operazione, piuttosto, semplicemente inseriscilo nella coda e provvedere ad esso da tempo a tempo, fino al completamento.

I valori promessi (o futuri) non contengono nulla quando viene eseguita la linea e viene valutata la riga successiva. Solo un po 'di tempo dopo i valori "risolvono" e viene risolto anche tutto ciò che dipende da quel valore, e così via, finché tutto non viene risolto e la coda è vuota.

    
risposta data 03.09.2018 - 11:05
fonte
1

Le promesse in JS sono un modo per fare una programmazione asincrona, che è non uguale al multithreading. Essenzialmente, nel codice sincrono a thread singolo, quando c'è qualche sorta di IO, il processore emette semplicemente un'istruzione per altro hardware , e il gioco è fatto. Dopodiché, rimane lì senza fare niente (almeno dal punto di vista del tuo programma), e aspetta che questo altro hardware sia finito - e questo di solito richiede molto tempo (nel senso che il La CPU potrebbe eseguire un numero significativo di altre attività durante quel periodo). Quindi non ci sono thread aggiuntivi nel solito senso della parola, ma c'è un po 'di elaborazione in parallelo (non sta succedendo nella CPU).

Con la programmazione asincrona, si assegna essenzialmente un callback da eseguire quando l'attività ha esito positivo (o non riesce), chiama un codice per "attivare" l'operazione asincrona, e poi si continua con la propria attività, facendo qualche altro lavoro utile nel frattempo. Quando l'altro hardware completa l'attività (o fallisce), la CPU viene notificata ed esegue il callback appropriato.

Puoi leggere ulteriori informazioni su come la CPU gestisce eventi asincroni qui.

Vedi anche: Concorrenza vs Multi-threading vs Asincrono Programmazione: spiegata .

    
risposta data 02.09.2018 - 21:30
fonte
1

L'attività asincrona può essere biforcuta dal runtime JS, ad esempio quando sono coinvolti solo sistemi esterni, ma può anche essere avviata / eseguita quando non c'è più altro codice da eseguire. Nel primo caso almeno la callback di completamento sarà pianificata per l'esecuzione successiva. In JS ciò accade quando lo stack di chiamate diventa vuoto e il cosiddetto ciclo di eventi esegue la successiva operazione pianificata o elabora eventi osservati (come i clic). Ecco perché in JS non puoi scrivere loop infiniti o altre costruzioni che portano a chiamate che non terminano mai.

    
risposta data 03.09.2018 - 08:31
fonte

Leggi altre domande sui tag