Execuție asincronă vs sincronă, ce înseamnă de fapt?

Care este diferența dintre execuția asincronă și sincronă?

Comentarii la întrebare (2)
Soluția

Atunci când executați ceva în mod sincron, așteptați ca acesta să se termine înainte de a trece la o altă sarcină. Atunci când executați ceva în mod asincron, puteți trece la o altă sarcină înainte ca aceasta să se termine.

Acestea fiind spuse, în contextul calculatoarelor, acest lucru se traduce prin executarea unui proces sau a unei sarcini pe un alt "fir". Un fir este o serie de comenzi (un bloc de cod) care există ca o unitate de lucru. Sistemul de operare poate gestiona mai multe fire de execuție și poate atribui unui fir de execuție o bucată ("felie") de timp de procesor înainte de a trece la un alt fir de execuție pentru a-i da rândul să lucreze. În esența sa (scuzați jocul de cuvinte), un procesor poate executa pur și simplu o comandă, nu are conceptul de a face două lucruri în același timp. Sistemul de operare simulează acest lucru prin alocarea de felii de timp pentru diferite fire de execuție.

Acum, dacă introduceți mai multe nuclee/procesoare în amestec, atunci lucrurile SE POT întâmpla efectiv în același timp. Sistemul de operare poate aloca timp unui fir de execuție pe primul procesor, apoi poate aloca același bloc de timp unui alt fir de execuție pe un alt procesor. Toate acestea se referă la a permite sistemului de operare să gestioneze finalizarea sarcinii dvs. în timp ce dvs. puteți continua în codul dvs. și să faceți alte lucruri.

Programarea asincronă este un subiect complicat din cauza semanticii modului în care lucrurile se leagă între ele atunci când le puteți face în același timp. Există numeroase articole și cărți pe această temă; aruncați o privire!

Comentarii (18)

Sincron/Asincron nu are nimic de-a face cu citirea multiplă.

Sincron sau Sincron sau Sincronizat* înseamnă "conectat" sau "dependent" într-un fel sau altul. Cu alte cuvinte, două sarcini sincrone trebuie să fie conștiente una de cealaltă, iar una dintre sarcini trebuie să se execute într-un mod care depinde de cealaltă, cum ar fi să aștepte să înceapă până când cealaltă sarcină s-a terminat.
Asincronă înseamnă că sunt total independente și niciuna dintre ele nu trebuie să țină cont de cealaltă în niciun fel, nici la inițiere, nici la execuție.

Sincronă (un singur fir):

1 thread ->   ||||||

Sincronă (cu mai multe fire):

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

Asincronă (un singur fir):

         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|| 

Asincron (cu mai multe fire):

 thread A ->     ||
 thread B ----->     || 
 thread C --------->     ||
  • Punctele de început și de sfârșit ale sarcinilor A, B, C sunt reprezentate prin caracterele ``.
  • Secțiuni de timp de procesare reprezentate prin bare verticale `|``.

Din punct de vedere tehnic, conceptul de sincron / asincron nu are de fapt a face cu firele de execuție. Deși, în general, este neobișnuit să găsești sarcini asincrone care rulează pe același fir, este posibil (vezi exemplele de mai jos) și este comună să găsești două sau mai multe sarcini care se execută sincron pe fire separate... Nu, conceptul de sincron/asincron are legătură singurel cu faptul că o a doua sarcină sau o sarcină ulterioară poate fi inițiată înainte ca cealaltă (prima) sarcină să se termine sau dacă trebuie să aștepte. Asta este tot. Nu este relevant pe ce fir (sau fire), sau procese, sau unități centrale de procesare, sau chiar pe ce hardware se execută sarcina (sarcinile). Într-adevăr, pentru a sublinia acest aspect, am editat grafica pentru a arăta acest lucru.

EXEMPLU ASINCRON. În rezolvarea multor probleme de inginerie, software-ul este conceput pentru a împărți problema globală în mai multe sarcini individuale, pe care le execută apoi în mod asincron. Inversarea unei matrice sau o problemă de analiză cu elemente finite sunt exemple bune. În informatică, sortarea unei liste este un exemplu. Rutina de sortare rapidă, de exemplu, împarte lista în două liste și le sortează pe fiecare dintre ele prin apelarea sa recursivă. În ambele exemple de mai sus, cele două sarcini pot fi (și adesea au fost) executate în mod asincron. Nu este necesar ca acestea să fie pe fire de execuție separate. Chiar și o mașină cu o singură unitate centrală de procesare și un singur fir de execuție poate fi codificată pentru a iniția procesarea celei de-a doua sarcini înainte ca prima să se fi încheiat. Singurul criteriu este ca rezultatele unei sarcini să nu fie necesare ca intrări pentru cealaltă sarcină. Atâta timp cât orele de început și de sfârșit ale sarcinilor se suprapun (lucru posibil numai dacă rezultatele niciuneia dintre ele nu sunt necesare ca intrări pentru cealaltă), acestea sunt executate în mod asincron, indiferent de numărul de fire de execuție utilizate.

EXEMPLU SINCRON. Orice proces format din mai multe sarcini în cazul în care sarcinile trebuie executate în succesiune, dar una dintre ele trebuie să fie executată pe o altă mașină (preluarea și/sau actualizarea datelor, obținerea unei cotații bursiere de la un serviciu financiar etc.). Dacă este pe o mașină separată, este pe un fir separat, indiferent dacă este sincron sau asincron.

Comentarii (26)

În termeni mai simpli:

SINCRON

Sunteți la coadă pentru a obține un bilet la film. Nu puteți obține un bilet până când toți cei din fața dvs. nu obțin unul, iar același lucru este valabil și pentru cei care stau la coadă în spatele dvs.

ASYNCHRON

Sunteți într-un restaurant cu multe alte persoane. Vă comandați mâncarea. Ceilalți oameni își pot comanda și ei mâncarea, nu trebuie să aștepte ca mâncarea dumneavoastră să fie gătită și să vă fie servită înainte de a putea comanda. În bucătărie, lucrătorii restaurantului gătesc, servesc și iau comenzi în permanență. Oamenii își vor primi mâncarea servită imediat ce aceasta este gătită.

Comentarii (3)

Explicație simplă prin analogie

Execuție sincronă

Șeful meu este un om ocupat. El îmi spune să scriu codul. Eu îi spun: "Bine. Mă apuc de treabă și el mă privește ca un vultur, stând în spatele meu, pe umăr. Îi spun: "Omule, WTF: de ce nu te duci să faci ceva până termin eu asta?".

iar el zice: "Nu, aștept aici până termini tu." Asta e sincronizare.

Execuție asincronă

Șeful îmi spune să o fac și, în loc să aștepte chiar acolo munca mea, șeful pleacă și face alte sarcini. Când îmi termin treaba, mă prezint pur și simplu șefului meu și îi spun "Am TERMINAT!" Aceasta este execuția asincronă.

(Urmați sfatul meu: nu lucrați NICIODATĂ cu șeful în spatele vostru).

Comentarii (1)

Executie sincrone înseamnă executarea se întâmplă într-o singură serie. Un->B->C->D. Dacă sunteți de asteptare aceste rutine, " A "va rula, apoi termina, apoi" B "va începe, apoi termina, apoi" C " va începe, etc.

Cu execuție Asincronă, de a începe o rutină, și lăsați-l să ruleze în fundal în timp ce începe următoarea, apoi la un moment dat, spun ", așteptați pentru ca aceasta să termine". L's mai multe, cum ar fi:

Start Un->B->C->C->Stai " O " pentru a termina

Avantajul este că puteți executa "B", " C " sau " D "în timp ce" A " este încă în desfășurare (în fundal, pe un fir separat), astfel încât să puteți profita mai bine de resursele și de a avea mai puține "se blochează" sau "asteapta".

Comentarii (2)

Sincron înseamnă că apelantul așteaptă răspuns sau finalizarea, asincron că apelantul continuă și un răspuns vine mai târziu (dacă este cazul).

Ca un exemplu:

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

    private static void doSomething()
    {
        Console.WriteLine("In call");
    }

Acest lucru va mereu ouput:

Before call
In call
After call

Dar dacă ar fi să facem ceva în acest sens asincron (mai multe moduri de a face), apoi de ieșire ar putea devin:

Before call
After call
In call

Deoarece metoda de a face apel asincron imediat continua cu următoarea linie de cod. Spun "poate", deoarece ordinea de executare poate't fi garantat cu asynch operațiuni. S-ar putea executa, de asemenea, ca și originalul, în funcție de firul timpilor, etc.

Comentarii (1)

Într-un cuvânt, sincronizarea se referă la două sau mai multe procese' start și end puncte, NU lor execuții. În acest exemplu, Procesul de O's endpoint este sincronizat cu Procesul de B's punctul de start:

SINCRON
|--------O--------|
|--------B--------|

Asincron procese, pe de altă parte, nu nu ai lor începe și puncte finale sincronizate:

ASINCRON
|--------O--------|
|--------B--------|

În cazul în care Un Proces se suprapune Procesului B, au're execută concomitent sau sincron (definiție dicționar), de aici confuzia.

UPDATE: Charles Bretana îmbunătățit răspunsul lui, astfel încât acest răspuns este acum doar un simplu (potențial simplificat) mnemonic.

Comentarii (4)

Cred că acest lucru este puțin rotundă despre explicație, dar încă se clarifică folosind exemplu din viața reală.

Mic Exemplu:

Las's spun redarea unui audio implică trei pași:

  1. Obtinerea comprimat cântec de pe harddisk
  2. Decomprima audio.
  3. Joaca audio necomprimate.

Dacă player-ul audio nu pas 1,2,3 secvențial pentru fiecare cântec atunci este sincron. Va trebui să așteptați pentru ceva timp pentru a auzi cântecul până cântecul devine de fapt preluat și decomprimat.

Dacă player-ul audio nu pas 1,2,3 independent unul de celălalt, atunci este asincron. de exemplu. În timp ce joacă audio 1 ( pasul 3), dacă acesta preia audio 3 de pe harddisk în paralel (pasul 1) și se decomprimă audio 2 in paralel. (pasul 2 ) Vei sfârși în auzind cântecul, fără a aștepta prea mult pentru a descărca și decomprima.

Comentarii (0)

Traducerea și asincron operațiuni sunt despre executarea de cod ordin

Sincron - presupune că sarcinile vor fi executate unul câte unul. O viitoare sarcina este la început doar un anterioară este terminat. Sarcina B nu este pornit până când sarcina nu este terminat

<img src="https://i.stack.imgur.com/BXNof.png" înălțime="200">

Asincron – dacă o sarcină nu returnează un rezultat imediat, dar vă oferă un control la o chemare sarcina cu o promisiune de a executa un cod mai târziu(de exemplu, apel invers, caracteristică). Sarcina B este executată chiar dacă sarcina nu este terminat

<img src="https://i.stack.imgur.com/8EoLM.png" înălțime="100">

DECI, răspunsul despre sincronizare și asincron: iOS, Android

Comentarii (3)

Pur și simplu a spus execuție asincronă este de a face lucruri în fundal.

De exemplu, dacă doriți să descărcați un fișier de pe internet s-ar putea folosi un sincron funcție pentru a face asta, dar se va bloca firul până când fișierul a terminat descărcarea. Acest lucru se poate face cererea dumneavoastră nu raspund la nici o intrare de utilizator.

În schimb, ai putea descărca fișiere în fundal folosind metoda asincron. În acest caz, funcția de descărcare a se întoarce imediat și execuția programului continuă în mod normal. Toate operațiunile de descărcare sunt efectuate în fundal, iar programul va fi notificat atunci când l's a terminat.

Comentarii (2)

Ca un exemplu foarte simplu,

SINCRON

Imaginați-3 elevi instruiți pentru a rula o cursă pe un drum.

1 elev execută o anumită distanță, se oprește și trece bagheta la a 2-a. Nimeni nu a început să curgă.

1------>
        2.
                3.

Când al 2-lea student preia ștafeta, ea începe pentru a rula o anumită distanță.

      1.
        2------>
                3.

Al 2-lea elev a primit o șiretul dezlegat. Acum, ea s-a oprit și legarea din nou. Din aceasta cauza, 2's end timp a fost extins și 3's timp de pornire a fost amânată.

      1.
        --2.--->
                3.

Acest model continuă până pe 3 preia ștafeta de la a 2-a și se termină cursa.

ASINCRON

Imaginați-vă doar 10 oameni aleatoare mers pe același drum. Ei're nu pe o listă de așteptare, desigur, doar la întâmplare pe la diferite locuri de pe drum, în ritmuri diferite.

A 2-a persoana's șiret-am dezlegat. S-a oprit să-l legat din nou.

Dar nimeni nu este în așteptare pentru ei pentru a obține o egalitate. Toată lumea este încă de mers pe jos, la fel cum au făcut-o înainte, în același ritm al lor.

10-->    9-->
   8--> 7-->   6-->
 5-->     4-->
1-->   2.    3-->
Comentarii (0)

Atunci când execută o secvență ca: a>b>c - >d>, dacă vom obține un eșec în mijlocul de execuție ca:

a
b
c
fail

Apoi ne-am re-începe de la început:

a
b
c
d

acest lucru este sincron

Dacă, cu toate acestea, avem aceeași secvență pentru a executa: a>b>c - >d>, și avem un eșec în mijloc:

a
b
c
fail

...dar în loc de a reporni de la început, ne-am re-începe de la punctul de eșec:

c
d

...asta este asincron.

Comentarii (2)

Am creat un gif pentru a explica acest lucru, sper să fie de ajutor: uite, linia 3 este asincron, iar altele sunt sincrone. toate liniile înainte de linia 3 ar trebui să aștepte până înainte de linia de sosire activitatea, dar pentru că linia 3 este asincron, următoarea linie (linia 4), don't așteptați pentru linia 3, dar linia 5 ar trebui să așteptați pentru linia 4 pentru a termina lucrările sale, și linia 6 ar trebui să așteptați pentru linia 5 și 7 la 6, pentru că linia de 4,5,6,7 nu sunt asincrone.

Comentarii (1)

Ești confuz Sincron cu Paralele vs Serie. Sincron înseamnă toate în același timp. Sincronizate înseamnă legate de fiecare alte, care poate însemna în serie sau la un interval fix. În timp ce programul este de a face toate, ea se execută în serie. Ia un dicționar...asta este ce avem ceai fără zahăr. Aveți ceai sau ceai îndulcit.

Comentarii (2)

Sincron practic înseamnă că puteți executa doar un singur lucru la un moment dat. Asincron înseamnă că puteți executa mai multe lucruri la un moment dat și don't trebuie să termin de executare curente de lucru, în scopul de a trece la următoarea.

Comentarii (1)

Folosiți un exemplu de instrucțiuni pentru a face un mic dejun

  1. Se toarnă o ceașcă de cafea.
  2. Căldură o tigaie, apoi se prăjește două ouă.
  3. Se prăjește trei felii de bacon.
  4. Pâine prăjită, două bucăți de pâine.
  5. Se adaugă unt și gem pe pâine prăjită.
  6. Se toarnă un pahar de suc de portocale.

Dacă aveți experiență de gătit, ai'd executa acele instrucțiuni asincron. te'd începe încălzirea tigaie pentru oua, apoi începe bacon. Te'd pus pâine în prăjitor de pâine, apoi începe să ouă. La fiecare pas al procesului, ai'd începe o sarcină, apoi porniți atenția la sarcinile care sunt gata pentru atenție.

Mic dejun gătit este un bun exemplu de asincron lucru pe care nu't paralel. O persoană (sau firul) se poate ocupa de toate aceste sarcini. Continuarea mic dejun analogie, o persoană poate face micul dejun asincron de a începe următoarea sarcină înainte de prima completeaza. Gătit progresează dacă este sau nu cineva este cu ochii pe ea. De îndată ce începe încălzirea tigaie pentru oua, puteți începe prăjire bacon. Odată ce bacon începe, puteți pune pâinea în toaster.

Pentru un algoritm paralel, ai'd nevoie de mai multe bucătari (sau fire). Unul ar face ouăle, unul la slănină, și așa mai departe. Fiecare ar fi concentrat doar pe asta o sarcină. Fiecare bucătar (sau firul) ar fi blocat sincron de așteptare pentru bacon să fie gata pentru a flip, sau toast pentru pop.

Referință la Asincron concepte de programare

Comentarii (0)

O funcționare sincronă face activitatea înainte de a se întoarce pentru a apelantului.

O operațiune asincron are cele mai multe (sau toate) activitatea după revenirea la apelant.

Comentarii (1)

O altă definiție engleză de Sincronizare este Aici

Coordonarea; combina.

Cred că este o definiție mai bună decât de "se Întâmplă în același timp". Care este, de asemenea, o definiție, dar eu nu't cred că este unul care se potrivește modul în care aceasta este folosită în informatică.

Deci o sarcină asincron nu este coordonat cu alte sarcini, întrucât o sarcină sincron ESTE co-coordonat cu alte sarcini, deci o termină înainte de a începe un alt.

Modul în care este realizat este o altă întrebare.

Comentarii (0)

Cred ca un bun mod de a gândi este un joc clasic de funcționare a Releului de Cursă

Sincron: Procesele cum ar fi membri ai aceleiași echipe, au câștigat't executa până când vor primi baton (sfârșitul executarea anterioară a procesului/runner) și totuși toate sunt hotărând în sincronizare cu fiecare alte.

Asincron: în cazul în Care procesele cum ar fi membrii unor echipe diferite pe același releu pista de curse, ei vor fugi și se va opri, asincron cu fiecare parte, dar în aceeași cursă (program general de execuție).

Are sens?

Comentarii (0)

În ceea ce privește "în același timp" definirea de executie sincrone (care este uneori confuz), aici's o modalitate buna de a înțelege:

Executie sincrone: Toate sarcinile într-un bloc de cod care sunt executate în același timp.

Execuție asincronă: Toate sarcinile într-un bloc de cod nu sunt toate executate în același timp.

Comentarii (1)