Qual è la differenza tra esecuzione asincrona e sincrona?
Qual è la differenza tra esecuzione asincrona e sincrona?
Risposte:
Quando esegui qualcosa in modo sincrono, attendi che finisca prima di passare a un'altra attività. Quando esegui qualcosa in modo asincrono, puoi 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 a un thread un pezzo ("slice") di tempo del processore prima di passare a un altro thread per fare un giro per fare un po 'di lavoro. Al suo centro (scusate il gioco di parole), un processore può semplicemente eseguire un comando, non ha il concetto di fare due cose contemporaneamente. Il sistema operativo simula ciò assegnando intervalli di tempo a thread diversi.
Ora, se si introducono più core / processori nel mix, allora le cose POSSONO effettivamente accadere contemporaneamente. Il sistema operativo può allocare il tempo a un thread sul primo processore, quindi allocare lo stesso intervallo di tempo a un altro thread su un processore diverso. Tutto ciò significa consentire al sistema operativo di gestire il completamento dell'attività mentre è possibile proseguire nel codice e fare altre cose.
La programmazione asincrona è un argomento complicato a causa della semantica di come le cose si uniscono quando puoi farle allo stesso tempo. Ci sono numerosi articoli e libri sull'argomento; dare un'occhiata!
Sincrono / Asincrono NON È NIENTE DA FARE CON IL MULTI-FILETTO.
Sincrono o Sincronizzato significa "connesso" o "dipendente" in qualche modo. In altre parole, due attività sincrone devono essere consapevoli l'una dell'altra e un'attività deve essere eseguita in un modo che dipende dall'altra, come attendere l'avvio fino al completamento dell'altra attività.
Asincrono significa che sono totalmente indipendenti e nessuno dei due deve considerare l'altro in alcun modo, né nell'iniziazione né nell'esecuzione.
Sincrono (un thread):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Sincrono (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 | |
| | | | | |
V V V V V V
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->|
Asincrono (multi-thread):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
<
, >
caratteri.|
Tecnicamente, il concetto di sincrono / asincrono non ha nulla a che fare con i thread . Sebbene, in generale, sia insolito trovare attività asincrone in esecuzione sullo stesso thread, è possibile (vedere sotto per esempi) ed è comune trovare due o più attività in esecuzione in modo sincrono su thread separati ... No, il concetto of synchronous / asynchronous ha a che fare esclusivamente con la possibilità di avviare o meno una seconda o successiva attività prima che l'altra (prima) attività sia stata completata o se deve attendere. Questo è tutto. Quale thread (o thread), processi o CPU o, in effetti, su quale hardware, le attività vengono eseguite non è rilevante. In effetti, per chiarire questo punto, ho modificato la grafica per mostrarlo.
ESEMPIO ASINCRONO:
Nel risolvere molti problemi di ingegneria, 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 di elementi finiti sono buoni esempi. Nell'informatica, l'ordinamento di un elenco è un esempio. La routine quicksort, ad esempio, divide l'elenco in due elenchi ed esegue un quicksort su ciascuno di essi, chiamando se stesso (quicksort) in modo ricorsivo. In entrambi gli esempi precedenti, le due attività possono (e spesso sono state) eseguite in modo asincrono. Non devono essere su thread separati. Anche una macchina con una CPU e un solo thread di esecuzione può essere codificata per avviare l'elaborazione di una seconda attività prima che la prima sia stata completata. L'unico criterio è quello i risultati di un'attività non sono necessari come input per l'altra attività. Finché le ore di inizio e fine delle attività si sovrappongono, (possibile solo se l'output di nessuna delle due è necessario come input per l'altra), vengono eseguite 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 una deve essere eseguita su un'altra macchina (recuperare e / o aggiornare i dati, ottenere una quotazione di borsa dal servizio finanziario, ecc.). Se si trova su una macchina separata, si trova su un thread separato, sia sincrono che asincrono.
In termini più semplici:
SINCRONO
Sei in coda per ottenere un biglietto per il cinema. Non puoi ottenerne uno finché tutti di fronte a te non ne ottengono uno, e lo stesso vale per le persone 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 tuo cibo sia cucinato e servito a te prima di poter ordinare. In cucina i lavoratori del ristorante cucinano, servono e prendono continuamente ordini. Le persone riceveranno il loro cibo non appena sarà cotto.
Esecuzione sincrona
Il mio capo è un uomo impegnato. Mi dice di scrivere il codice. Gli dico: bene. Comincio e mi sta guardando come un avvoltoio, in piedi dietro di me, fuori dalla mia spalla. Sono tipo "Amico, WTF: perché non vai a fare qualcosa mentre finisco questo?"
è tipo: "No, aspetto proprio qui fino a quando non avrai finito." Questo è sincrono.
Esecuzione asincrona
Il capo mi dice di farlo, e invece di aspettare proprio lì per il mio lavoro, il capo si spegne e svolge altri compiti. Quando finisco il mio lavoro, riferisco semplicemente al mio capo e dico: "HO FATTO!" Questa è l'esecuzione asincrona.
(Segui il mio consiglio: MAI lavorare con il capo dietro di te.)
L'esecuzione sincrona significa che l'esecuzione avviene in una singola serie. A->B->C->D
. Se stai chiamando quelle routine, A
verrà eseguito, quindi terminato, quindi B
inizierà, quindi terminerà, quindi C
inizierà, ecc.
Con l' esecuzione asincrona , inizi una routine e la lasci correre in background mentre inizi la prossima, quindi a un certo punto dì "aspetta che finisca". È più simile a:
Inizio A->B->C->D->
Attendere per A
alla fine
Il vantaggio è che puoi eseguire B
, C
e o D
mentre A
è ancora in esecuzione (in background, su un thread separato), quindi puoi sfruttare meglio le tue risorse e avere meno "blocchi" o "attese".
In breve, la sincronizzazione si riferisce a due o più punti iniziale e finale dei processi , NON alle loro esecuzioni . In questo esempio, l'endpoint del processo A è sincronizzato con il punto iniziale del processo B:
SINCRONO | -------- -------- A | | -------- -------- B |
I processi asincroni, d'altra parte, non hanno sincronizzato il loro inizio e gli endpoint:
ASYNCHRONOUS | -------- -------- A | | -------- -------- B |
Laddove il Processo A si sovrappone al Processo B, sono in esecuzione contemporaneamente o in modo sincrono (definizione del dizionario), da cui la confusione.
AGGIORNAMENTO: Charles Bretana ha migliorato la sua risposta , quindi questa risposta ora è solo un semplice mnemonico (potenzialmente semplificato).
Sincrono significa che il chiamante attende la risposta o il completamento, 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 uscirà sempre:
Before call
In call
After call
Ma se dovessimo fare qualcosa di asincrono (più modi per farlo), l'output potrebbe diventare:
Before call
After call
In call
Perché il metodo che effettua la chiamata asincrona continuerebbe immediatamente con la riga di codice successiva. Dico "potrebbe", perché l'ordine di esecuzione non può essere garantito con operazioni asincrone. Potrebbe anche essere eseguito come originale, a seconda dei tempi dei thread, ecc.
Penso che questa sia una spiegazione un po 'rotonda ma chiarisce ancora usando l'esempio della vita reale.
Piccolo esempio:
Diciamo che la riproduzione di un audio comporta tre passaggi:
Se il tuo lettore audio fa il passo 1,2,3 in sequenza per ogni brano, allora è sincrono. Dovrai aspettare un po 'di tempo per ascoltare la canzone fino a quando la canzone non viene effettivamente recuperata e decompressa.
Se il tuo lettore audio fa i passi 1,2,3 l'uno indipendentemente dall'altro, allora è asincrono. vale a dire. Durante la riproduzione dell'audio 1 (passaggio 3), se recupera l'audio 3 dall'hard disk in parallelo (passaggio 1) e decomprime l'audio 2 in parallelo. (passaggio 2) Finirai per ascoltare la canzone senza aspettare molto per il recupero e la decompressione.
Le operazioni di sincronizzazione e asincrono riguardano l'ordine di esecuzione di una nuova attività in relazione all'attività corrente. Due attività su una tabella: attività corrente e una nuova attività
Sincrono (blocco): implica che le attività verranno eseguite una alla volta. Un'attività successiva viene avviata solo al termine dell'attività precedente. Task 2
non viene avviato fino al Task 1
termine
Asincrono (non bloccante): implica che l'attività restituisca immediatamente il controllo con la promessa di eseguire un codice e di notificare il risultato in un secondo momento (ad es. Callback, funzione). Task 2
viene eseguito anche se Task 1
non è terminato
Quindi risposta su sincronizzazione e asincronizzazione: in iOS , in Android
Detto semplicemente che l'esecuzione asincrona sta facendo cose in background.
Ad esempio, se si desidera scaricare un file da Internet, è possibile utilizzare una funzione sincrona per farlo, ma bloccherà il thread fino al termine del download del file. Ciò può rendere la tua applicazione non rispondente a qualsiasi input dell'utente.
Invece è possibile scaricare il file in background utilizzando 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à notificato al termine.
Come esempio molto semplice,
SINCRONO
Immagina 3 studenti delle scuole incaricati di correre una staffetta su una strada.
Il 1 ° studente percorre la sua data distanza, si ferma e passa il testimone al 2 °. Nessun altro ha iniziato a correre.
1------>
2.
3.
Quando il 2 ° studente recupera il testimone, inizia a correre per la sua data distanza.
1.
2------>
3.
La seconda studentessa si è sciolta i lacci delle scarpe. Ora si è fermata e si è riallacciata. Per questo motivo, l'ora di fine della seconda è stata estesa e l'ora di inizio della terza è stata ritardata.
1.
--2.--->
3.
Questo schema continua fino a quando il 3 recupera il testimone dal 2 ° e termina la gara.
ASYNCHRONOUS
Immagina 10 persone a caso che camminano sulla stessa strada. Ovviamente non sono in coda, ma camminano casualmente su diversi punti della strada a ritmi diversi.
Il laccio della seconda persona si è slegato. Si fermò per legarlo di nuovo.
Ma nessuno sta aspettando che lei lo leghi. Tutti gli altri stanno ancora camminando come prima, con lo stesso ritmo.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
Ho creato un GIF per spiegarlo, spero di esserti stato utile: guarda, la linea 3 è asincrona e altre sono sincrone. tutte le righe prima della riga 3 dovrebbero attendere fino a quando la riga termina il suo lavoro, ma a causa della riga 3 è asincrona, la riga successiva (riga 4), non attendere la riga 3, ma la riga 5 dovrebbe attendere che la riga 4 finisca il suo lavoro, e la linea 6 dovrebbe attendere la linea 5 e 7 per 6, poiché la linea 4,5,6,7 non è asincrona.
Quando eseguiamo una sequenza come: a> b> c> d>, se otteniamo un errore nel mezzo dell'esecuzione come:
a
b
c
fail
Quindi ricominciamo 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 riavviare dall'inizio, ricominciamo dal punto di errore:
c
d
... questo è noto come asincrono.
Stai confondendo Synchronous con Parallel vs Series. Sincrono significa tutto allo stesso tempo. Sincronizzato significa correlato a ciascuno degli altri che può significare in serie o ad un intervallo fisso. Mentre il programma sta facendo tutto, funziona in serie. Prendi un dizionario ... ecco perché abbiamo un tè non dolce. Hai tè o tè zuccherato.
Sincrono significa sostanzialmente che puoi eseguire solo una cosa alla volta. Asincrono significa che puoi eseguire più cose alla volta e non devi finire di eseguire la cosa corrente per passare alla successiva.
Usa un esempio di istruzioni per preparare la colazione
Se hai esperienza di cucina, eseguiresti queste istruzioni in modo asincrono. inizieresti a scaldare la padella per le uova, poi inizieresti la pancetta. Metteresti il pane nel tostapane, quindi avvieresti le uova. Ad ogni fase del processo, avvii un'attività, quindi rivolgi la tua attenzione alle attività che sono pronte per la tua attenzione.
Cucinare la colazione è un buon esempio di asincrono lavoro che non è parallelo. Una persona (o thread) può gestire tutte queste attività. Continuando l'analogia della colazione, una persona può fare colazione in modo asincrono avviando l'attività successiva prima che la prima venga completata. La cottura procede indipendentemente dal fatto che qualcuno lo stia guardando. Non appena inizi a scaldare la padella per le uova, puoi iniziare a friggere la pancetta. Una volta che la pancetta inizia, puoi mettere il pane nel tostapane.
Per un algoritmo parallelo, avresti bisogno di più cook (o thread). Uno farebbe le uova, uno la pancetta e così via. Ognuno sarebbe concentrato solo su quell'unico compito. Ogni cuoco (o thread) verrebbe bloccato in modo sincrono in attesa che la pancetta fosse pronta a girare, o che scoppiasse il brindisi.
Riferimento da concetti di programmazione asincrona
Un'operazione sincrona fa il suo lavoro prima di tornare al chiamante.
Un'operazione asincrona fa (quasi tutto) il suo lavoro dopo essere tornata al chiamante.
Per quanto riguarda il " allo stesso tempo definizione " dell'esecuzione sincrona (che talvolta confonde), ecco un buon modo per capirla:
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 pensarci sia una classica staffetta da corsa
Sincrono : processi come membri della stessa squadra, non verranno eseguiti fino a quando non riceveranno il testimone (fine dell'esecuzione del processo / corridore precedente) e tuttavia agiranno tutti in sincronia tra loro.
Asincrono : dove processi come membri di team diversi sulla stessa pista di staffetta, correranno e si fermeranno, si sincronizzeranno tra loro, ma all'interno della stessa gara (esecuzione complessiva del programma).
Ha senso?
Una diversa definizione inglese di Synchronize è qui
Coordinata; combinano.
Penso che sia una definizione migliore di "Happening allo stesso tempo". Anche questa è una definizione, ma non penso che sia quella che si adatta al modo in cui viene utilizzata in Informatica.
Quindi un'attività asincrona non è coordinata con altre attività, mentre un'attività sincrona È coordinata con altre attività, quindi una finisce prima che ne inizi un'altra.
Come si ottiene ciò è una domanda diversa.
Sincrono significa che verrà eseguita l'esecuzione in modalità coda per attività. Supponiamo che sia condiviso solo un veicolo che deve essere condiviso tra amici per raggiungere la destinazione uno per uno.
In caso asincrono, ogni amico può ottenere un veicolo noleggiato e raggiungere la sua destinazione.
Sì, sincrono significa allo stesso tempo, letteralmente, significa lavorare tutti insieme. più umani / oggetti nel mondo possono fare più cose allo stesso tempo ma se guardiamo al computer, dice che sincrono significa dove i processi lavorano insieme che significa che i processi dipendono dal ritorno reciproco ed è per questo che vengono eseguiti uno dopo l'altro in sequenza corretta. Mentre asincrono significa che i processi non funzionano insieme, possono funzionare contemporaneamente (se sono su multithread), ma funzionano in modo indipendente.