Frage Asynchrone vs synchrone Ausführung, was bedeutet das wirklich?


Was ist der Unterschied zwischen asynchroner und synchroner Ausführung?


869
2018-04-14 15:39


Ursprung


Antworten:


Wenn Sie etwas synchron ausführen, warten Sie, bis es beendet ist, bevor Sie mit einer anderen Aufgabe fortfahren. Wenn Sie etwas asynchron ausführen, können Sie zu einer anderen Aufgabe wechseln, bevor sie beendet wird.

Im Kontext von Computern bedeutet dies, dass ein Prozess oder eine Aufgabe auf einem anderen "Thread" ausgeführt wird. Ein Thread ist eine Reihe von Befehlen (ein Block von Code), die als eine Arbeitseinheit existieren. Das Betriebssystem kann mehrere Threads verwalten und einem Thread ein Stück ("Slice") der Prozessorzeit zuweisen, bevor es zu einem anderen Thread wechselt, um sich an die Arbeit zu machen. Im Kern (Verzeihung des Wortspiels) kann ein Prozessor einfach einen Befehl ausführen, er hat kein Konzept, zwei Dinge gleichzeitig zu tun. Das Betriebssystem simuliert dies, indem es Zeitabschnitte verschiedenen Threads zuweist.

Nun, wenn Sie mehrere Kerne / Prozessoren in den Mix einführen, können Dinge tatsächlich zur gleichen Zeit 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 wegen der Semantik, wie Dinge zusammenhängen, wenn Sie sie gleichzeitig tun können. Es gibt zahlreiche Artikel und Bücher zu diesem Thema; Guck mal!


1360
2018-04-14 15:43



Synchron / Asynchron hat nichts mit mehrfädigem zu tun.

Synchron oder Synchronisiert bedeutet in irgendeiner Weise "verbunden" oder "abhängig". Mit anderen Worten, zwei synchrone Tasks müssen sich gegenseitig bewusst sein, und eine Task muss auf irgendeine Art und Weise ausgeführt werden, die von der anderen abhängig ist, z. B. warten bis zum Start, bis die andere Task abgeschlossen ist.
Asynchron bedeutet, dass sie völlig unabhängig sind und dass keiner den anderen in irgendeiner Weise berücksichtigen muss, weder bei der Einleitung 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 (Multi-Threaded):

 thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|
  • Start- und Endpunkte der Aufgaben A, B, C repräsentiert durch <, > Figuren.
  • CPU-Zeitscheiben werden durch vertikale Balken dargestellt |

Technisch gesehen ist das Konzept wirklich synchrone / asynchrone hat nichts mit Threads zu tun. Obwohl es im Allgemeinen ungewöhnlich ist, asynchrone Tasks zu finden, die auf demselben Thread laufen, ist es möglich (siehe unten für Beispiele) und es ist verbreitet um zwei oder mehr Aufgaben zu finden, die synchron ausgeführt werden trennen Threads ... Nein, das Konzept der synchronen / asynchronen muss tun einzig und allein mit, ob eine zweite oder nachfolgende Aufgabe eingeleitet werden kann, bevor die andere (erste) Aufgabe beendet wurde oder ob sie warten muss. Das ist alles. Welche Threads (oder Threads) oder Prozesse oder CPUs oder tatsächlich welche Hardware, auf denen die Task ausgeführt wird, sind nicht relevant. In der Tat, um diesen Punkt zu machen, habe ich die Grafiken bearbeitet, um dies zu zeigen.

ASYNCHRONES BEISPIEL. Bei der Lösung vieler technischer Probleme ist die Software so ausgelegt, dass das Gesamtproblem in mehrere einzelne Aufgaben aufgeteilt und dann asynchron ausgeführt wird. Das Invertieren einer Matrix oder ein Problem der Analyse finiter Elemente sind gute Beispiele. Beim Rechnen ist das Sortieren einer Liste ein Beispiel. Die Schnellsortierroutine teilt beispielsweise die Liste in zwei Listen auf und sortiert sie durch rekursives Aufrufen. In beiden obigen Beispielen können (und wurden) die beiden Aufgaben asynchron ausgeführt werden. Sie müssen nicht auf separaten Threads sein. Sogar eine Maschine mit einer CPU und nur einem Ausführungs-Thread kann codiert werden, um die Verarbeitung einer zweiten Aufgabe zu initiieren, bevor eine erste abgeschlossen wurde. Das einzige Kriterium ist das Die Ergebnisse einer Aufgabe sind nicht als Eingaben für die andere Aufgabe erforderlich. Solange sich die Start- und Endzeiten der Aufgaben überschneiden (dies ist nur möglich, wenn die Ausgabe von beiden als Eingaben 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 Tasks besteht, in denen die Tasks nacheinander ausgeführt werden müssen, aber auf einem anderen Rechner ausgeführt werden müssen (Daten abrufen und / oder aktualisieren, einen Aktienkurs von einem Finanzdienstleister abrufen usw.). Wenn es auf einem separaten Computer ist, befindet es sich in einem separaten Thread, ob synchron oder asynchron.


921
2018-04-14 15:53



Einfacher ausgedrückt:

SYNCHRON

Sie befinden sich in einer Warteschlange, um ein Filmticket zu erhalten. Du kannst nicht eins bekommen, bis alle vor dir eins bekommen, und dasselbe gilt für die Leute, die hinter dir Schlange stehen.

ASYNCHRON

Sie sind in einem Restaurant mit vielen anderen Leuten. Du bestellst dein Essen. Andere Leute können ihr Essen auch bestellen, sie müssen nicht darauf warten, dass dein Essen gekocht und dir serviert wird, bevor sie es bestellen können. Im Küchenrestaurant kochen, servieren und nehmen die Arbeiter ständig Bestellungen auf. Die Leute werden ihr Essen serviert bekommen, sobald es gekocht wird.


519
2017-11-07 15:43



Ich versuche so einfach wie möglich zu erklären, damit du (hoffentlich) daran denkst:

Synchrone Ausführung

Mein Chef ist ein vielbeschäftigter Mann. Er sagt mir, dass ich den Code schreiben soll. Ich sage ihm: Gut. Ich fange an und er beobachtet mich wie ein Geier, der hinter mir steht, von meiner Schulter. Ich bin wie "Alter, WTF: warum gehst du nicht und tust etwas, während ich das beende?"

er ist wie: "Nein, ich bin Ich warte hier bis du fertig bist. "Das ist synchron.

Asynchrone Ausführung

Der Chef sagt mir, es zu tun, und anstatt direkt auf meine Arbeit zu warten, geht der Chef ab und macht andere Aufgaben. Wenn ich meinen Job beende, melde ich mich einfach bei meinem Chef und sage: "Ich bin FERTIG!" Dies ist die asynchrone Ausführung.

Es ist wirklich so einfach! Ich hoffe es hilft.

(Nimm meinen Ratschlag: Arbeite NIEMALS mit dem Chef hinter dir.)


247
2018-06-08 11:13



Synchrone Ausführung bedeutet, dass die Ausführung in einer einzigen Serie erfolgt. A->B->C->D. Wenn Sie diese Routinen aufrufen, A läuft, dann fertig, dann B wird beginnen, dann beenden, dann Cwird beginnen usw.

Mit Asynchrone Ausführung, beginnen Sie eine Routine und lassen Sie sie im Hintergrund laufen, während Sie Ihre nächste beginnen, und sagen Sie dann irgendwann "Warten Sie, bis dies beendet ist". Es ist mehr wie:

Anfang  A->B->C->D->Warten zum A beenden

Der Vorteil ist, dass Sie ausführen können B, Cund oder D während A läuft noch (im Hintergrund, in einem separaten Thread), so dass Sie Ihre Ressourcen besser nutzen können und weniger "hängen" oder "warten".


73
2018-04-14 15:43



Synchron bedeutet, dass der Aufrufer auf die Antwort oder den Abschluss wartet, asynchron, dass der Aufrufer 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 ausgegeben:

Before call
In call
After call

Aber wenn wir etwas asynchron machen (mehrere Möglichkeiten, es zu tun), dann die Ausgabe könnte werden:

Before call
After call
In call

Da die Methode, die den asynchronen Aufruf durchführt, sofort mit der nächsten Codezeile fortgesetzt wird. Ich sage "könnte", weil die Reihenfolge der Ausführung nicht mit asynch-Operationen garantiert werden kann. Es könnte auch als Original ausgeführt werden, abhängig von den Timings des Threads usw.


46
2018-04-14 15:47



Ich denke, das ist etwas rund um Erklärung, aber immer noch klärt es mit realen Beispiel.

Kleines Beispiel:

Angenommen, das Abspielen eines Audiomaterials umfasst drei Schritte:

  1. Den komprimierten Song von der Festplatte holen
  2. Dekomprimieren Sie den Ton.
  3. Spielen Sie das unkomprimierte Audio ab.

Wenn Ihr Audioplayer für jedes Lied sequentiell 1,2,3 schreitet, ist es synchron. Sie müssen einige Zeit warten, bis Sie den Song hören, bis der Song tatsächlich abgerufen und dekomprimiert wird.

Wenn Ihr Audioplayer die Schritte 1,2,3 unabhängig voneinander ausführt, ist er asynchron. dh. Während der Wiedergabe von Audio 1 (Schritt 3), wenn Audio 3 von der Festplatte parallel abgerufen wird (Schritt 1) ​​und der Audio 2 parallel dekomprimiert wird. (Schritt 2 ) Sie werden den Song hören, ohne lange auf das Holen und Dekomprimieren zu warten.


30
2018-04-14 16:27



Kurz gesagt, Synchronisation bezieht sich auf zwei oder mehr Prozesse Anfang und Ende Punkte, NICHT ihr Hinrichtungen. In diesem Beispiel wird der Endpunkt von Prozess A mit dem Startpunkt von Prozess B synchronisiert:

SYNCHRON
   | -------- A -------- |
                     | -------- B -------- |

Asynchrone Prozesse dagegen tun es nicht Start- und Endpunkte synchronisiert haben:

ASYNCHRON
   | -------- A -------- |
         | -------- B -------- |

Wenn Prozess A Prozess B überlappt, werden sie gleichzeitig ausgeführt oder synchron (Wörterbuchdefinition), daher die Verwirrung.

UPDATE: Charles Bretana hat sich verbessert seine AntwortDaher ist diese Antwort jetzt nur eine einfache (möglicherweise zu stark vereinfachte) Gedächtnisstütze.


25
2017-08-17 14:11



Einfach gesagt, asynchrone Ausführung macht Sachen im Hintergrund.

Wenn Sie zum Beispiel eine Datei aus dem Internet herunterladen möchten, verwenden Sie möglicherweise eine synchrone Funktion, um dies zu tun, aber es wird Ihren Thread blockieren, bis die Datei fertig heruntergeladen wurde. Dadurch kann Ihre Anwendung auf keine Benutzereingabe reagieren.

Stattdessen können Sie die Datei im Hintergrund mit 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.


18
2018-04-14 15:41



Beim Ausführen einer Sequenz wie: a> b> c> d>, wenn wir mitten in der Ausführung einen Fehler bekommen, wie:

a
b
c
fail

Dann fangen wir wieder 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 Anfang an neu zu starten, fangen wir wieder an vom Punkt des Scheiterns:

c
d

... das ist asynchron bekannt.


14
2017-12-15 13:38



Als ein wirklich einfaches Beispiel,

SYNCHRON

Stellen Sie sich 10 Schüler vor, die angewiesen werden, als Schlange auf einer Straße zu laufen.

Die 3. Schülerin hat ihre Schnürsenkel gelöst. Jetzt hat sie aufgehört und wieder zu binden.

Alle Schüler hinter ihr haben aufgehört und warten jetzt darauf, dass sie es bindet. Der 1. und der 2. Schüler sind an ihnen vorbei gegangen und in ihrem üblichen Tempo weitergegangen.

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

ASYNCHRON

Stellen Sie sich einfach 10 zufällige Leute vor, die auf derselben Straße gehen. Sie sind natürlich nicht in einer Warteschlange, sondern laufen in verschiedenen Schritten zufällig an verschiedenen Stellen auf der Straße.

Der Schnürsenkel der 3. Person wurde gelöst. Sie hielt an, um es wieder zu binden.

Aber niemand wartet darauf, dass sie es bindet. Alle anderen gehen immer noch genauso, wie sie es vorher getan haben, in derselben Geschwindigkeit wie sie.

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

10
2017-10-02 11:22