Was ist der Unterschied zwischen asynchroner und synchroner Ausführung?
Was ist der Unterschied zwischen asynchroner und synchroner Ausführung?
Antworten:
Wenn Sie etwas synchron ausführen, warten Sie, bis es abgeschlossen ist, bevor Sie mit einer anderen Aufgabe fortfahren. Wenn Sie etwas asynchron ausführen, können Sie zu einer anderen Aufgabe übergehen, bevor diese abgeschlossen ist.
Im Kontext von Computern bedeutet dies jedoch, dass ein Prozess oder eine Aufgabe in einem anderen "Thread" ausgeführt wird. Ein Thread ist eine Reihe von Befehlen (ein Codeblock), die als Arbeitseinheit vorhanden sind. Das Betriebssystem kann mehrere Threads verwalten und einem Thread einen Teil ("Slice") Prozessorzeit zuweisen, bevor er zu einem anderen Thread wechselt, um ihm die Möglichkeit zu geben, einige Arbeiten auszuführen. Im Kern (entschuldigen Sie das Wortspiel) kann ein Prozessor einfach einen Befehl ausführen. Er hat nicht das Konzept, zwei Dinge gleichzeitig zu tun. Das Betriebssystem simuliert dies, indem es verschiedenen Threads Zeitscheiben zuweist.
Wenn Sie nun mehrere Kerne / Prozessoren in den Mix einführen, können die Dinge tatsächlich gleichzeitig passieren. Das Betriebssystem kann einem Thread auf dem ersten Prozessor Zeit zuweisen und dann denselben Zeitblock einem anderen Thread auf einem anderen Prozessor zuweisen. Bei all dem geht es darum, dem Betriebssystem zu ermöglichen, die Ausführung Ihrer Aufgabe zu verwalten, während Sie in Ihrem Code fortfahren und andere Dinge tun können.
Asynchrone Programmierung ist ein kompliziertes Thema, da die Semantik der Zusammenhänge besteht, wenn Sie sie gleichzeitig ausführen können. Es gibt zahlreiche Artikel und Bücher zu diesem Thema; Guck mal!
Synchron / Asynchron hat nichts mit MULTI-THREADING zu tun.
Synchron oder synchronisiert bedeutet "verbunden" oder "abhängig" in irgendeiner Weise. Mit anderen Worten, zwei synchrone Aufgaben müssen sich gegenseitig bewusst sein, und eine Aufgabe muss auf eine Weise ausgeführt werden, die von der anderen abhängig ist, z. B. warten, bis die andere Aufgabe abgeschlossen ist.
Asynchron bedeutet, dass sie völlig unabhängig sind und keiner den anderen in irgendeiner Weise berücksichtigen muss, weder bei der Initiierung noch bei der Ausführung.
Synchron (ein Thread):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Synchron (Multithread):
thread A -> |<---A---->|
\
thread B ------------> ->|<----B---------->|
\
thread C ----------------------------------> ->|<------C----->|
Asynchron (ein 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-->|
Asynchron (Multithread):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
<
, >
Zeichen.|
Technisch gesehen hat das Konzept von synchron / asynchron wirklich nichts mit Threads zu tun . Obwohl es im Allgemeinen ungewöhnlich ist, asynchrone Aufgaben zu finden, die auf demselben Thread ausgeführt werden, ist es möglich (Beispiele siehe unten), und es ist üblich , zwei oder mehr Aufgaben zu finden, die synchron auf separaten Threads ausgeführt werden ... Nein, das Konzept von synchron / asynchron zu tun hat , nur mit , ob eine zweite oder nachfolgende Aufgabe kann vor dem anderen (ersten) Aufgabe begonnen werden abgeschlossen ist , oder ob sie warten müssen. Das ist alles. Welcher Thread (oder welche Threads) oder Prozesse oder CPUs oder tatsächlich auf welcher Hardware die Task (s) ausgeführt werden, ist nicht relevant. Um dies zu verdeutlichen, habe ich die Grafiken bearbeitet, um dies zu zeigen.
ASYNCHRONES BEISPIEL:
Bei der Lösung vieler technischer Probleme ist die Software darauf ausgelegt, das Gesamtproblem in mehrere einzelne Aufgaben aufzuteilen und diese dann asynchron auszuführen. Das Invertieren einer Matrix oder ein Problem der Finite-Elemente-Analyse sind gute Beispiele. Beim Rechnen ist das Sortieren einer Liste ein Beispiel. Die Quicksort-Routine teilt beispielsweise die Liste in zwei Listen auf und führt für jede eine Quicksortierung durch, wobei sie sich selbst (Quicksort) rekursiv aufruft. In beiden obigen Beispielen können (und wurden) die beiden Aufgaben asynchron ausgeführt. Sie müssen sich nicht in separaten Threads befinden. Sogar eine Maschine mit einer CPU und nur einem Ausführungsthread kann codiert werden, um die Verarbeitung einer zweiten Aufgabe zu initiieren, bevor die erste abgeschlossen ist. Das einzige Kriterium ist, dass die Ergebnisse einer Aufgabe nicht als Eingaben für die andere Aufgabe erforderlich sind. Solange sich Start- und Endzeit der Aufgaben überschneiden (nur möglich, wenn die Ausgabe von keiner als Eingabe für die andere benötigt wird), werden sie asynchron ausgeführt, unabhängig davon, wie viele Threads verwendet werden.
SYNCHRONES BEISPIEL:
Jeder Prozess, der aus mehreren Aufgaben besteht, bei denen die Aufgaben nacheinander ausgeführt werden müssen, eine jedoch auf einem anderen Computer ausgeführt werden muss (Daten abrufen und / oder aktualisieren, einen Börsenkurs vom Finanzdienstleister erhalten usw.). Wenn es sich auf einem separaten Computer befindet, befindet es sich auf einem separaten Thread, egal ob synchron oder asynchron.
Einfacher ausgedrückt:
SYNCHRON
Sie stehen in einer Warteschlange, um eine Kinokarte zu erhalten. Sie können keinen bekommen, bis jeder vor Ihnen einen bekommt, und das gilt auch für die Leute, die sich hinter Ihnen in der Warteschlange befinden.
ASYNCHRON
Sie sind mit vielen anderen Menschen in einem Restaurant. Sie bestellen Ihr Essen. Andere Leute können auch ihr Essen bestellen, sie müssen nicht warten, bis Ihr Essen gekocht und Ihnen serviert wird, bevor sie bestellen können. In der Küche kochen, servieren und nehmen die Mitarbeiter ständig Bestellungen entgegen. Die Leute bekommen ihr Essen serviert, sobald es gekocht ist.
Synchrone Ausführung
Mein Chef ist ein vielbeschäftigter Mann. Er sagt mir, ich soll den Code schreiben. Ich sage ihm: Gut. Ich fange an und er beobachtet mich wie einen Geier, der hinter mir von meiner Schulter steht. Ich bin wie "Alter, WTF: Warum gehst du nicht und machst etwas, während ich das beende?"
Er sagt: "Nein, ich warte hier, bis du fertig bist." Das ist synchron.
Asynchrone Ausführung
Der Chef sagt mir, ich soll es tun, und anstatt genau dort auf meine Arbeit zu warten, geht der Chef los und erledigt andere Aufgaben. Wenn ich meinen Job beendet habe, melde ich mich einfach bei meinem Chef und sage: "Ich bin fertig!" Dies ist die asynchrone Ausführung.
(Nimm meinen Rat an: Arbeite NIEMALS mit dem Chef hinter dir.)
Synchrone Ausführung bedeutet, dass die Ausführung in einer einzigen Reihe erfolgt. A->B->C->D
. Wenn Sie diese Routinen aufrufen, A
werden sie ausgeführt, dann beendet, dann B
gestartet, dann beendet, dann C
gestartet usw.
Bei der asynchronen Ausführung beginnen Sie eine Routine und lassen sie im Hintergrund laufen, während Sie die nächste starten. Sagen Sie dann irgendwann "Warten Sie, bis dies abgeschlossen ist". Es ist eher wie:
Start A->B->C->D->
Warten für A
bis Ende
Der Vorteil ist , dass Sie ausführen können B
, C
und oder D
während A
noch (im Hintergrund, auf einem separaten Thread) ausgeführt wird , so dass Sie besser nutzen Sie Ihre Ressourcen nehmen und weniger „hängt“ oder „wartet“ haben.
Kurz gesagt, Synchronisation bezieht sich auf den Start- und Endpunkt von zwei oder mehr Prozessen , NICHT auf deren Ausführung . In diesem Beispiel wird der Endpunkt von Prozess A mit dem Startpunkt von Prozess B synchronisiert:
SYNCHRON | -------- A -------- | | -------- B -------- |
Asynchrone Prozesse, auf der anderen Seite, haben nicht ihre Start- und Endpunkte synchronisiert:
ASYNCHRON | -------- A -------- | | -------- B -------- |
Wenn sich Prozess A mit Prozess B überschneidet, werden sie gleichzeitig oder synchron ausgeführt (Wörterbuchdefinition), daher die Verwirrung.
UPDATE: Charles Bretana hat seine Antwort verbessert , daher ist diese Antwort nur noch eine einfache (möglicherweise stark vereinfachte) Mnemonik.
Synchron bedeutet, dass der Anrufer auf die Antwort oder den Abschluss wartet, asynchron, dass der Anrufer fortfährt und eine Antwort später kommt (falls zutreffend).
Als Beispiel:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
Dies wird immer Folgendes ausgeben:
Before call
In call
After call
Wenn wir jedoch doSomething asynchron machen würden (mehrere Möglichkeiten, dies zu tun), könnte die Ausgabe wie folgt aussehen:
Before call
After call
In call
Weil die Methode, die den asynchronen Aufruf ausführt, sofort mit der nächsten Codezeile fortfährt. Ich sage "könnte", weil die Reihenfolge der Ausführung bei asynchronen Operationen nicht garantiert werden kann. Es kann auch als Original ausgeführt werden, abhängig von den Thread-Timings usw.
Ich denke, dies ist eine etwas runde Erklärung, aber es wird immer noch anhand eines Beispiels aus dem wirklichen Leben verdeutlicht.
Kleines Beispiel:
Angenommen, das Abspielen eines Audios umfasst drei Schritte:
Wenn Ihr Audio-Player für jedes Lied nacheinander die Schritte 1,2,3 ausführt, ist er synchron. Sie müssen einige Zeit warten, um das Lied zu hören, bis das Lied tatsächlich abgerufen und dekomprimiert wird.
Wenn Ihr Audio-Player die Schritte 1,2,3 unabhängig voneinander ausführt, ist er asynchron. dh. Wenn während der Wiedergabe von Audio 1 (Schritt 3) Audio 3 parallel von der Festplatte abgerufen wird (Schritt 1) und Audio 2 parallel dekomprimiert wird. (Schritt 2) Am Ende hören Sie das Lied, ohne lange auf das Abrufen und Dekomprimieren zu warten.
Bei Synchronisierungs- und Asynchronisierungsvorgängen geht es um die Ausführungsreihenfolge einer neuen Aufgabe in Bezug auf die aktuelle Aufgabe. Zwei Aufgaben in einer Tabelle: aktuelle Aufgabe und eine neue Aufgabe
Synchron (Blockieren) - impliziert, dass Aufgaben einzeln ausgeführt werden. Eine nächste Aufgabe wird erst gestartet, nachdem die vorherige Aufgabe beendet wurde. Task 2
wird erst gestartet, wenn Task 1
es beendet ist
Asynchron (nicht blockierend) - impliziert, dass die Task die Kontrolle sofort mit dem Versprechen zurückgibt, einen Code auszuführen und später über das Ergebnis zu benachrichtigen (z. B. Rückruf, Funktion). Task 2
wird ausgeführt, auch wenn Task 1
es nicht fertig ist
SO Antwort über Synchronisierung und Asynchronisierung: in iOS , in Android
Einfach gesagt, asynchrone Ausführung macht Sachen im Hintergrund.
Wenn Sie beispielsweise eine Datei aus dem Internet herunterladen möchten, können Sie dazu eine Synchronfunktion verwenden, die Ihren Thread jedoch blockiert, bis der Download der Datei abgeschlossen ist. Dies kann dazu führen, dass Ihre Anwendung nicht mehr auf Benutzereingaben reagiert.
Stattdessen können Sie die Datei im Hintergrund mithilfe der asynchronen Methode herunterladen. In diesem Fall kehrt die Download-Funktion sofort zurück und die Programmausführung wird normal fortgesetzt. Alle Download-Vorgänge werden im Hintergrund ausgeführt und Ihr Programm wird benachrichtigt, wenn es fertig ist.
Als wirklich einfaches Beispiel:
SYNCHRON
Stellen Sie sich 3 Schüler vor, die angewiesen wurden, ein Staffellauf auf einer Straße durchzuführen.
Die erste Schülerin läuft ihre vorgegebene Distanz, hält an und gibt den Staffelstab an die zweite weiter. Niemand sonst hat angefangen zu rennen.
1------>
2.
3.
Wenn die 2. Schülerin den Staffelstab zurückholt, beginnt sie, ihre vorgegebene Distanz zu laufen.
1.
2------>
3.
Die 2. Schülerin hat ihren Schnürsenkel gelöst. Jetzt hat sie angehalten und wieder gefesselt. Aus diesem Grund wurde die Endzeit des 3. verlängert und die Startzeit des 3. verzögert.
1.
--2.--->
3.
Dieses Muster setzt sich fort, bis der 3. den Staffelstab vom 2. abholt und das Rennen beendet.
ASYNCHRON
Stellen Sie sich 10 zufällige Personen vor, die auf derselben Straße gehen. Sie stehen natürlich nicht in einer Warteschlange, sondern gehen nur zufällig in unterschiedlichen Schritten auf verschiedenen Orten auf der Straße.
Der Schnürsenkel der 2. Person wurde gelöst. Sie blieb stehen, um es wieder zusammenzubinden.
Aber niemand wartet darauf, dass sie es festhält. Alle anderen gehen immer noch auf dem gleichen Weg wie zuvor, in dem gleichen Tempo wie sie.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
Ich habe ein GIF erstellt, um dies zu erklären. Ich hoffe, hilfreich zu sein: Schauen Sie, Zeile 3 ist asynchron und andere sind synchron. Alle Zeilen vor Zeile 3 sollten warten, bis die Zeile ihre Arbeit beendet hat. Da Zeile 3 jedoch asynchron ist, warten Sie in der nächsten Zeile (Zeile 4) nicht auf Zeile 3, sondern in Zeile 5 auf Zeile 4, um die Arbeit zu beenden. und Zeile 6 sollte auf Zeile 5 und 7 auf 6 warten, da Zeile 4,5,6,7 nicht asynchron sind.
Wenn Sie eine Sequenz wie folgt ausführen: a> b> c> d>, wenn während der Ausführung ein Fehler auftritt, wie:
a
b
c
fail
Dann fangen wir von vorne an:
a
b
c
d
das ist synchron
Wenn wir jedoch dieselbe Sequenz ausführen müssen: a> b> c> d>, und wir haben einen Fehler in der Mitte:
a
b
c
fail
... aber anstatt von vorne neu zu starten, starten wir von der Fehlerquelle aus neu:
c
d
... das ist als asynchron bekannt.
Sie verwechseln Synchronous mit Parallel vs Series. Synchron bedeutet alles gleichzeitig. Synchronisierte Mittel, die miteinander in Beziehung stehen, können in Reihe oder in einem festen Intervall bedeuten. Während das Programm alles tut, läuft es in Reihe. Holen Sie sich ein Wörterbuch ... deshalb haben wir unsüßigen Tee. Sie haben Tee oder gesüßten Tee.
Synchron bedeutet im Grunde, dass Sie immer nur eine Sache gleichzeitig ausführen können. Asynchron bedeutet, dass Sie mehrere Dinge gleichzeitig ausführen können und die Ausführung des aktuellen Dings nicht beenden müssen, um mit dem nächsten fortzufahren.
Verwenden Sie ein Beispiel für Anweisungen zum Zubereiten eines Frühstücks
Wenn Sie Erfahrung im Kochen haben, führen Sie diese Anweisungen asynchron aus. Sie würden anfangen, die Pfanne für Eier zu erwärmen, und dann den Speck starten. Sie würden das Brot in den Toaster legen und dann die Eier starten. In jedem Schritt des Prozesses würden Sie eine Aufgabe starten und dann Ihre Aufmerksamkeit auf Aufgaben richten, die für Ihre Aufmerksamkeit bereit sind.
Das Frühstück kochen ist ein gutes Beispiel für asynchron Arbeit, die nicht parallel ist. Eine Person (oder ein Thread) kann alle diese Aufgaben erledigen. Wenn Sie die Frühstücksanalogie fortsetzen, kann eine Person das Frühstück asynchron zubereiten, indem Sie die nächste Aufgabe starten, bevor die erste abgeschlossen ist. Das Kochen schreitet fort, unabhängig davon, ob jemand es sieht oder nicht. Sobald Sie die Pfanne für die Eier erwärmen, können Sie mit dem Braten des Specks beginnen. Sobald der Speck beginnt, können Sie das Brot in den Toaster geben.
Für einen parallelen Algorithmus benötigen Sie mehrere Köche (oder Threads). Man würde die Eier machen, man den Speck und so weiter. Jeder würde sich nur auf diese eine Aufgabe konzentrieren. Jeder Koch (oder Faden) wird synchron blockiert und wartet darauf, dass der Speck zum Umdrehen bereit ist oder der Toast platzt.
Referenz aus asynchronen Programmierkonzepten
Eine synchrone Operation erledigt ihre Arbeit, bevor sie zum Anrufer zurückkehrt.
Eine asynchrone Operation erledigt (den größten Teil oder die gesamte) Arbeit, nachdem sie zum Anrufer zurückgekehrt ist.
In Bezug auf die Definition der synchronen Ausführung " zur gleichen Zeit " (die manchmal verwirrend ist) ist hier ein guter Weg, dies zu verstehen:
Synchrone Ausführung : Alle Aufgaben innerhalb eines Codeblocks werden gleichzeitig ausgeführt.
Asynchrone Ausführung : Nicht alle Aufgaben innerhalb eines Codeblocks werden gleichzeitig ausgeführt.
Ich denke, eine gute Art, daran zu denken, ist ein klassisches Staffellaufrennen
Synchron : Prozesse wie Mitglieder desselben Teams werden erst ausgeführt, wenn sie den Staffelstab erhalten (Ende der Ausführung des vorherigen Prozesses / Läufers), und dennoch agieren sie alle synchron miteinander.
Asynchron : Wenn Prozesse wie Mitglieder verschiedener Teams auf derselben Staffellaufbahn laufen und anhalten, werden sie asynchron miteinander, jedoch innerhalb desselben Rennens (Gesamtprogrammausführung).
Macht das Sinn?
Eine andere englische Definition von Synchronize finden Sie hier
Koordinate; kombinieren.
Ich denke, das ist eine bessere Definition als "gleichzeitig geschehen". Das ist auch eine Definition, aber ich denke nicht, dass es die ist, die zu der Art passt, wie es in der Informatik verwendet wird.
Eine asynchrone Aufgabe ist also nicht mit anderen Aufgaben koordiniert, während eine synchrone Aufgabe mit anderen Aufgaben koordiniert ist, sodass eine Aufgabe beendet wird, bevor eine andere beginnt.
Wie dies erreicht wird, ist eine andere Frage.
Synchron bedeutet, dass die Ausführung nacheinander in der Warteschlange ausgeführt wird. Angenommen, es gibt nur Fahrzeuge, die unter Freunden geteilt werden müssen, um ihr Ziel zu erreichen. Ein Fahrzeug nach dem anderen wird geteilt.
Im asynchronen Fall kann jeder Freund ein Mietfahrzeug bekommen und sein Ziel erreichen.
Ja, synchron bedeutet gleichzeitig, wörtlich, es bedeutet, alle zusammen zu arbeiten. Mehrere Menschen / Objekte auf der Welt können mehrere Dinge gleichzeitig tun. Wenn wir uns jedoch den Computer ansehen, heißt es, dass synchron bedeutet, dass die Prozesse zusammenarbeiten, was bedeutet, dass die Prozesse von der Rückkehr voneinander abhängig sind und dass sie deshalb ausgeführt werden nacheinander in der richtigen Reihenfolge. Während asynchron bedeutet, dass Prozesse nicht zusammenarbeiten, können sie gleichzeitig arbeiten (wenn sie sich auf Multithread befinden), aber unabhängig voneinander.