Esecuzione asincrona vs sincrona, cosa significa veramente?

Qual è la differenza tra l’esecuzione asincrona e sincrona?

Quando si esegue qualcosa in modo sincrono, si attende che finisca prima di passare a un’altra attività. Quando si esegue qualcosa in modo asincrono, è ansible passare a un’altra attività prima che finisca.

Detto questo, nel contesto dei computer questo si traduce nell’esecuzione di un processo o attività su un altro “thread”. Un thread è una serie di comandi (un blocco di codice) che esiste come unità di lavoro. Il sistema operativo può gestire più thread e assegnare un thread un pezzo (“slice”) del tempo del processore prima di passare a un altro thread per dargli un turno di lavoro. Nel suo nucleo (scusate il gioco di parole), un processore può semplicemente eseguire un comando, non ha il concetto di fare due cose contemporaneamente. Il sistema operativo lo simula allocando porzioni di tempo a thread diversi.

Ora, se introduci più core / processori nel mix, le cose POSSONO effettivamente accadere nello stesso momento. Il sistema operativo può allocare il tempo a un thread sul primo processore, quindi allocare lo stesso blocco di tempo a un altro thread su un processore diverso. Tutto ciò significa consentire al sistema operativo di gestire il completamento dell’attività mentre è ansible continuare nel codice e fare altre operazioni.

La programmazione asincrona è un argomento complicato a causa della semantica di come le cose si uniscono quando le si può fare allo stesso tempo. Ci sono numerosi articoli e libri sull’argomento; dare un’occhiata!

Sincrono / Asincrono NON HA NULLA DA FARE CON MULTI-THREADING.

Sincrono o sincronizzato significa “connesso” o “dipendente” in qualche modo. In altre parole, due task sincroni devono essere consapevoli l’uno dell’altro e un’attività deve essere eseguita in un modo che dipende dall’altra, ad esempio attendere per iniziare fino al completamento dell’altra attività.
Asincrono significa che sono totalmente indipendenti e nessuno dei due deve considerare l’altro in alcun modo, sia all’inizio che nell’esecuzione.

Sincrono (un thread):

1 thread -> |<---A---->||<----B---------->||<------C----->| 

Sincrona (multi-thread):

 thread A -> |<---A---->| \ thread B ------------> ->|<----B---------->| \ thread C ----------------------------------> ->|<------C----->| 

Asincrono (un thread):

  A-Start ------------------------------------------ A-End | B-Start -----------------------------------------|--- B-End | | C-Start ------------------- C-End | | | | | | | | VVVVVV 1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 

Asincrono (multi-thread):

  thread A -> |<---A---->| thread B -----> |<----B---------->| thread C ---------> |<------C--------->| 
  • Punti di inizio e fine delle attività A, B, C rappresentati da < , > caratteri.
  • Fasce temporali della CPU rappresentate da barre verticali |

Tecnicamente, il concetto di sincrono / asincrono non ha nulla a che fare con i thread . Sebbene, in generale, sia inusuale trovare task asincroni in esecuzione sullo stesso thread, è ansible, (vedi sotto per gli esempi) ed è comune trovare due o più task che eseguono in modo sincrono su thread separati ... No, il concetto di sincrono / asincrono deve fare solo con o meno una seconda o successiva attività può essere avviata prima che l'altra (prima) attività è stata completata, o se deve aspettare. Questo è tutto. Quale thread (o thread), o processi, o CPU, o in effetti, quale hardware, l'attività [s] viene eseguita su non è rilevante. In effetti, per rendere questo punto ho modificato la grafica per mostrare questo.

ESEMPIO ASINCRONO. Nel risolvere molti problemi di progettazione, il software è progettato per suddividere il problema generale in più attività individuali e quindi eseguirle in modo asincrono. L'inversione di una matrice o un problema di analisi degli elementi finiti sono buoni esempi. Nel calcolo, l'ordinamento di un elenco è un esempio. La routine di ordinamento rapido, ad esempio, divide l'elenco in due elenchi e ordina ciascuno di essi chiamando in modo ricorsivo. In entrambi gli esempi precedenti, le due attività possono (e spesso sono state) eseguite in modo asincrono. Non hanno bisogno di essere su thread separati. Anche una macchina con una CPU e un solo thread di esecuzione può essere codificato per avviare l'elaborazione di una seconda attività prima che una prima sia completata. L'unico criterio è che i risultati di un'attività non sono necessari come input per l'altra attività . Finché i tempi di inizio e fine delle attività si sovrappongono, (ansible solo se l'output di nessuno è necessario come input per l'altro), vengono eseguiti in modo asincrono, indipendentemente dal numero di thread in uso.

ESEMPIO SINCRONO. Qualsiasi processo costituito da più attività in cui le attività devono essere eseguite in sequenza, ma deve essere eseguita su un'altra macchina (recuperare e / o aggiornare i dati, ottenere una quotazione azionaria da un servizio finanziario, ecc.). Se si trova su una macchina separata, si trova su un thread separato, sincrono o asincrono.

In termini più semplici:

SINCRONO

Sei in coda per ottenere un biglietto del cinema. Non puoi ottenerne uno finché tutti quelli che hai davanti non ne ricevono uno, e lo stesso vale per le persone che si sono messe in coda dietro di te.

ASYNCHRONOUS

Sei in un ristorante con molte altre persone. Ordina il tuo cibo. Altre persone possono anche ordinare il loro cibo, non devono aspettare che il cibo venga cotto e servito a voi prima che possano ordinare. Nel ristorante della cucina i lavoratori cucinano, servono e prendono gli ordini continuamente. Le persone riceveranno il loro cibo non appena sarà cotto.

Cercherò di spiegarti nel modo più semplice ansible, quindi (si spera) ricorderai:

Esecuzione sincrona

Il mio capo è un uomo impegnato. Mi dice di scrivere il codice. Gli dico: bene. Comincio e mi guarda come un avvoltoio, in piedi dietro di me, dalla mia spalla. Sono tipo “Amico, WTF: perché non vai a fare qualcosa mentre finisco questo?”

è tipo: “No, sto aspettando proprio qui finchè non finisci”. Questo è sincrono.

Esecuzione asincrona

Il capo mi dice di farlo, e invece di aspettare lì per il mio lavoro, il capo si ferma e fa altri compiti. Quando finisco il mio lavoro, faccio semplicemente rapporto al mio capo e dico: “I’m DONE!” Questa è l’esecuzione asincrona.

È davvero così semplice! Spero che sia d’aiuto.

(Segui il mio consiglio: non lavorare MAI con il capo dietro di te.)

Esecuzione sincrona significa che l’esecuzione avviene in una singola serie. A->B->C->D Se chiami quelle routine, A verrà eseguito, quindi terminato, quindi B inizierà, quindi terminerà, quindi C inizierà, ecc.

Con l’ esecuzione asincrona , si inizia una routine e si esegue in background mentre si avvia la successiva, quindi ad un certo punto, dire “attendere che finisca”. È più simile a:

Avvia A->B->C->D-> Attendi che A

Il vantaggio è che puoi eseguire B , C e D mentre A è ancora in esecuzione (in background, su un thread separato), in modo da poter sfruttare meglio le tue risorse e avere meno “blocchi” o “attese”.

Sincrona significa che il chiamante attende la risposta o il completamento, in modo asincrono che il chiamante continua e una risposta arriva più tardi (se applicabile).

Come esempio:

  static void Main(string[] args) { Console.WriteLine("Before call"); doSomething(); Console.WriteLine("After call"); } private static void doSomething() { Console.WriteLine("In call"); } 

Questo sarà sempre fuori:

 Before call In call After call 

Ma se dovessimo creare doSomething asincrono (più modi per farlo), l’output potrebbe diventare:

 Before call After call In call 

Perché il metodo che effettua la chiamata asincrona continuerà immediatamente con la riga successiva di codice. Dico “potrebbe”, perché l’ordine di esecuzione non può essere garantito con operazioni asincrone. Potrebbe anche essere eseguito come originale, in base ai tempi dei thread, ecc.

Penso che questo sia un po ‘di spiegazione, ma chiarisce ancora usando un esempio di vita reale.

Piccolo esempio:

Diciamo che riprodurre un audio comporta tre passaggi:

  1. Ottenere la canzone compressa dal disco rigido
  2. Decomprimi l’audio.
  3. Riproduci l’audio non compresso.

Se il tuo lettore audio fa un passo 1,2,3 in sequenza per ogni canzone, allora è sincrono. Dovrai aspettare un po ‘di tempo per ascoltare la canzone fino a quando la canzone non viene prelevata e decompressa.

Se il tuo lettore audio fa un passo 1,2,3 indipendente l’uno dall’altro, allora è asincrono. vale a dire. Durante la riproduzione di audio 1 (passaggio 3), se recupera l’audio 3 dal disco rigido in parallelo (passaggio 1) e decomprime l’audio 2 in parallelo. (passo 2) Finirai per ascoltare la canzone senza aspettare molto per il recupero e la decompressione.

In poche parole, la sincronizzazione si riferisce a due o più punti di inizio e fine dei processi, NON alle loro esecuzioni . In questo esempio, l’endpoint di Processo A è sincronizzato con il punto di inizio del processo B:

 SINCRONO
    | -------- -------- A |
                      | -------- -------- B |

I processi asincroni, d’altra parte, non hanno il loro inizio e il loro punto di sincronizzazione sincronizzati:

 ASYNCHRONOUS
    | -------- -------- A |
          | -------- -------- B |

Dove il processo A si sovrappone al processo B, vengono eseguiti simultaneamente o in modo sincrono (definizione del dizionario), quindi la confusione.

AGGIORNAMENTO: Charles Bretana ha migliorato la sua risposta , quindi questa risposta è ora solo un semplice (potenzialmente semplificato) mnemonico.

Detto semplicemente, l’esecuzione asincrona sta facendo cose in background.

Ad esempio, se si desidera scaricare un file da Internet, è ansible utilizzare una funzione sincrona per farlo, ma bloccherà il thread fino al completamento del download del file. Ciò può rendere la tua applicazione non rispondente a qualsiasi input dell’utente.

Invece è ansible scaricare il file in background usando il metodo asincrono. In questo caso la funzione di download ritorna immediatamente e l’esecuzione del programma continua normalmente. Tutte le operazioni di download vengono eseguite in background e il programma verrà avvisato al termine.

Quando esegui una sequenza come: a> b> c> d>, se otteniamo un errore nel mezzo dell’esecuzione come:

 a b c fail 

Quindi ripartiamo dall’inizio:

 a b c d 

questo è sincrono

Se, tuttavia, abbiamo la stessa sequenza da eseguire: a> b> c> d>, e abbiamo un errore nel mezzo:

 a b c fail 

… ma invece di ricominciare dall’inizio, ripartiamo dal punto di fallimento:

 c d 

… questo è noto come asincrono.

Come un esempio davvero semplice,

SINCRONO

Immagina 10 studenti scolastici incaricati di camminare come una fila su una strada.

Il terzo studente si sciolse il laccio delle scarpe. Ora si è fermata e si lega di nuovo.

Tutti gli studenti dietro di lei si sono fermati e ora stanno aspettando che lei lo leghi. Il 1 ° e il 2 ° studente li hanno superati tutti e continuano il loro solito ritmo.

 10-->9-->8-->7-->6-->5-->4-->3. 2-->1--> 

ASYNCHRONOUS

Immagina solo 10 persone a caso che camminano sulla stessa strada. Non sono in coda, naturalmente, camminando a caso in posti diversi sulla strada in modi diversi.

Il laccio delle scarpe della 3a persona è stato slegato. Si fermò per farlo bind di nuovo.

Ma nessuno sta aspettando che lei lo leghi. Tutti gli altri stanno ancora camminando nello stesso modo in cui lo facevano prima, in quello stesso ritmo.

 10--> 9--> 8--> 7--> 6--> 5--> 4--> 3. 2--> 1--> 

Stai confondendo Synchronous con Parallel vs Series. Sincrono significa tutto allo stesso tempo. Mezzi sincronizzati relativi a ogni altra cosa che può significare in serie o ad intervalli fissi. Mentre il programma sta facendo tutto, è in esecuzione in serie. Ottieni un dizionario … questo è il motivo per cui abbiamo un tè non dolcificato. Hai tè o tè zuccherato.

Modello di programmazione sincrona : un thread viene assegnato a un’attività e inizia a lavorarci. Una volta completata l’attività, è disponibile per l’attività successiva. In questo modello, non può lasciare l’attività in esecuzione a metà per riprendere un’altra attività. Discutiamo di come questo modello funziona in ambienti single e multi-thread.

Single Threaded – Se abbiamo un paio di attività su cui lavorare e il sistema attuale fornisce solo un singolo thread, i task vengono assegnati uno alla volta al thread. Può essere raffigurato pittoricamente come
Synchronous Single Threaded

Multi-threaded : in questo ambiente, avevamo più thread che possono occupare queste attività e iniziare a lavorarci. Significa che abbiamo un pool di thread (è ansible creare anche nuovi thread in base ai requisiti e alle risorse disponibili) e una serie di attività. Quindi questi thread possono lavorare su questi come
Multi-threaded sincrono

Modello di programmazione asincrona : al contrario del modello di programmazione sincrono, qui una volta thread avvia l’esecuzione di un’attività che può mantenerla a metà, salvare lo stato corrente e avviare l’esecuzione di un’altra attività.

Filettatura singola Single Threade asincrona

Multi-Threaded Multi-threaded asincrono

Altro qui – https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/

Synchronous significa fondamentalmente che puoi eseguire solo una cosa alla volta. Asincrono significa che è ansible eseguire più cose alla volta e non è necessario terminare l’esecuzione della cosa corrente per passare alla successiva.

Un’operazione sincrona funziona prima di tornare al chiamante.

Un’operazione asincrona svolge (la maggior parte o tutta) il proprio lavoro dopo essere tornata al chiamante.

Sincrono : quando un’attività viene eseguita in modo sincrono, si attende il completamento di un’attività prima di passare a un’altra attività. Un compito dipende dalla fine di un altro

Asincrono : quando un’attività viene eseguita in modo asincrono, è ansible passare direttamente a un’altra attività prima che il precedente sia stato completato. Un’attività non dipende dall’altra.

Nella programmazione, le attività vengono eseguite su un ” thread “. È necessario comprendere che è ansible creare più thread per le attività al fine di evitare l’impilamento in una singola coda.

Detto questo, il concetto di sincrono e asincrono non ha molto a che fare con i thread, la ragione per cui dico che è raro vedere le attività in esecuzione in modo asincrono su un singolo thread (anche se tecnicamente ansible).

Riguardo alla definizione ” allo stesso tempo ” di esecuzione sincrona (che a volte confonde), ecco un buon modo per capirlo:

Esecuzione sincrona : tutte le attività all’interno di un blocco di codice vengono eseguite tutte contemporaneamente.

Esecuzione asincrona : tutte le attività all’interno di un blocco di codice non vengono eseguite tutte contemporaneamente.

Penso che un buon modo di pensarla sia una classica Relay Race

Sincrono : processi come membri dello stesso team, non verranno eseguiti fino a quando non riceveranno il testimone (fine dell’esecuzione del processo / runner precedente) eppure agiscono tutti in sincronia tra loro.

Asincrono : quando processi come membri di diversi team sulla stessa pista di gara relay, corrono e si fermano, asincroni tra loro, ma all’interno della stessa gara (esecuzione complessiva del programma).

Ha senso?

Una diversa definizione inglese di Sincronizza è qui

Coordinata; combinano.

Penso che sia una definizione migliore di “Happening allo stesso tempo”. Quella è anche una definizione, ma non penso che sia quella che si adatta al modo in cui viene usata in Informatica.

Quindi un’attività asincrona non è co-coordinata con altre attività, mentre un’attività sincrona è co-coordinata con altre attività, quindi una finisce prima che un’altra inizi.

Il modo in cui viene raggiunto è una domanda diversa.

Sincrono significa eseguire in modo coda l’esecuzione di uno ad uno. Supponiamo che ci sia solo un veicolo che deve essere condiviso tra amici per raggiungere la propria destinazione, uno per uno sarà condiviso.
In caso asincrono ogni amico può ottenere il veicolo noleggiato e raggiungere la sua destinazione.