Asynchron oder Multithreading – Gibt es einen Unterschied?

Erstellt ein asynchroner Aufruf immer einen neuen Thread? Was ist der Unterschied zwischen den beiden?

Wird bei einem asynchronen Aufruf immer ein neuer Thread erstellt oder verwendet?

Wikipedia sagt :

In der Computerprogrammierung sind asynchrone Ereignisse diejenigen, die unabhängig vom Hauptprogrammablauf auftreten. Asynchrone Aktionen sind Aktionen, die in einem nicht blockierenden Schema ausgeführt werden, wodurch der Hauptprogrammablauf die Verarbeitung fortsetzen kann.

Ich weiß, Async-Aufrufe können auf einzelne Threads erfolgen? Wie ist das möglich?

Diese Frage ist fast zu allgemein, um zu antworten.

Im allgemeinen Fall erstellt ein asynchroner Aufruf nicht unbedingt einen neuen Thread. Das ist eine Möglichkeit, es zu implementieren, wobei ein bereits existierender Thread-Pool oder ein externer process auf andere Weise verwendet wird. Es hängt stark von Sprache, Objektmodell (falls vorhanden) und Laufzeitumgebung ab.

Asynchron bedeutet nur, dass der aufrufende Thread nicht sitzt und auf die Antwort wartet, noch findet die asynchrone Aktivität im aufrufenden Thread statt.

Darüber hinaus müssen Sie genauer werden.

Wenn die Operation, die asynchron ausgeführt werden muss, keine CPU erfordert, kann diese Operation ausgeführt werden, ohne dass ein anderer Thread erstellt wird. Wenn die asynchrone Operation beispielsweise E / A ist, muss die CPU nicht auf den Abschluss der E / A warten. Es muss nur die Operation starten und kann dann zu anderen Arbeiten übergehen, während die E / A-Hardware (Festplattencontroller, Netzwerkschnittstelle usw.) die E / A funktioniert. Die Hardware informiert die CPU, wenn sie fertig ist, indem sie die CPU unterbricht, und das Betriebssystem übergibt das Ereignis dann an Ihre Anwendung.

Häufig stellen Abstraktionen und APIs auf höherer Ebene die zugrunde liegenden asynchronen APIs, die vom Betriebssystem und der zugrunde liegenden Hardware verfügbar sind, nicht zur Verfügung. In diesen Fällen ist es normalerweise einfacher, Threads für asynchrone Operationen zu erstellen, selbst wenn der erzeugte Thread gerade auf eine E / A-Operation wartet.

Wenn die asynchrone Operation erfordert, dass die CPU arbeitet, muss diese Operation im Allgemeinen in einem anderen Thread stattfinden, damit sie wirklich asynchron ist. Auch dann ist es nur asynchron, wenn mehr als eine Ausführungseinheit vorhanden ist.

Nein, asynchrone Aufrufe beinhalten nicht immer Threads.

Sie starten normalerweise eine Art von Operation, die parallel mit dem Aufrufer fortgesetzt wird. Diese Operation kann jedoch von einem anderen process, vom Betriebssystem, von anderer Hardware (wie einem Festplattencontroller), von einem anderen Computer im Netzwerk oder von einem Menschen ausgeführt werden. Threads sind nicht die einzige Möglichkeit, Dinge parallel zu erledigen.

Multi Threading bezieht sich auf mehr als eine Operation, die im selben process stattfindet. Während async-Programmierung über processe verteilt. Wenn meine Operationen beispielsweise einen Webdienst aufrufen, muss der Thread nicht warten, bis der Webdienst zurückkehrt. Hier verwenden wir asynchrone Programmierung, die es dem Thread nicht erlaubt, auf einen process in einem anderen Computer zu warten. Und wenn es beginnt, eine Antwort vom Webservice zu erhalten, kann es den Hauptthread unterbrechen, um zu sagen, dass der Webservice die Verarbeitung der Anfrage abgeschlossen hat. Jetzt kann der Haupt-Thread das Ergebnis verarbeiten.

JavaScript ist single-threaded und asynchron. Wenn Sie beispielsweise XmlHttpRequest verwenden, stellen Sie ihm eine callbackfunktion zur Verfügung, die asynchron ausgeführt wird, wenn die Antwort zurückkehrt.

John Resig hat eine gute Erklärung der damit verbundenen Frage, wie Timer in JavaScript funktionieren .

Windows hatte seit den nicht preemptiven Zeiten (Versionen 2.13, 3.0, 3.1 usw.) immer asynchrone Verarbeitung mit der Nachrichtenschleife, weit vor der Unterstützung echter Threads. Um Ihre Frage zu beantworten, ist es nicht notwendig, einen Thread für die asynchrone Verarbeitung zu erstellen.

Asynchrone Anrufe müssen nicht einmal auf dem gleichen System / Gerät erfolgen, auf dem der Anruf ausgeführt wurde. Wenn die Frage also lautet, benötigt ein asynchroner Aufruf einen Thread im aktuellen process, lautet die Antwort nein. Es muss jedoch irgendwo einen Ausführungs-Thread geben, der die asynchrone Anfrage verarbeitet.

Thread der Ausführung ist ein vager Begriff. In einem kooperativen Task-System wie den frühen Macintosh- und Windows-Betriebssystemen könnte der Thread der Ausführung einfach derselbe process sein, bei dem die Anforderung einen anderen Stack, einen statementszeiger usw. ausführt. Wenn jedoch im Allgemeinen über asynchrone Aufrufe gesprochen wird , sie bedeuten typischerweise Aufrufe, die von einem anderen Thread behandelt werden, wenn es sich um einen prozessinternen (dh innerhalb desselben processes) oder um einen anderen process handelt, wenn es interprozessual ist.

Beachten Sie, dass Interprozess- (oder Interprozess-) Kommunikation (IPC) allgemein verallgemeinert wird, um die Kommunikation zwischen processen einzuschließen, da die Techniken zum Sperren und Synchronisieren von Daten normalerweise gleich sind, unabhängig davon, in welchem ​​process die einzelnen Ausführungsstränge ausgeführt werden.

Einige Systeme ermöglichen es Ihnen, die Nebenläufigkeit im coreel für einige Einrichtungen zu nutzen, die callbacke verwenden. Für eine eher obskure Instanz wurden asynchrone E / A-Callbacks verwendet, um nicht blockierende Internet-Server in den nicht preemptiven Multitasking-Tagen von Mac System 6-8 zu implementieren.

Auf diese Weise haben Sie gleichzeitige Ausführungsströme “in”, die Sie ohne Threads programmieren.

Asynchron bedeutet nur, dass Sie Ihr Programm nicht blockieren, wenn Sie darauf warten, dass etwas (functionsaufruf, Gerät usw.) beendet wird. Es kann in einem separaten Thread implementiert werden, aber es ist auch üblich, einen dedizierten Thread für synchrone Tasks zu verwenden und über irgendeine Art von Ereignissystem zu kommunizieren und somit asynchrones Verhalten zu erreichen.

Es gibt Beispiele für single-threaded asynchrone Programme. Etwas wie:

...do something ...send some async request while (not done) ...do something else ...do async check for results 

Die Art von asynchronen Aufrufen ist so, dass Sie, wenn Sie möchten, dass die Anwendung während des Anrufs weiterläuft, entweder einen neuen Thread erstellen oder zumindest einen anderen Thread verwenden müssen, den Sie ausschließlich für den Zweck erstellt haben asynchrone callbacke bearbeiten

Manchmal möchten Sie je nach Situation eine asynchrone Methode aufrufen, sie aber dem Benutzer als synchron erscheinen lassen (dh blockieren, bis die asynchrone Methode signalisiert hat, dass sie abgeschlossen ist). Dies kann durch Win32-APIs wie WaitForSingleObject erreicht werden .

Eine asynchrone Operation ist eine Operation, die nach dem Initiieren im Hintergrund fortgesetzt wird, ohne den Aufrufer dazu zu zwingen, auf den Abschluss des Vorgangs zu warten, bevor anderer Code ausgeführt wird.

Anstatt das aufrufende Programm (oder den Thread) zu blockieren, bis eine Antwort eintrifft, sendet eine asynchrone (auch nicht blockierende) Implementierung eine Anfrage an die database oder den Webservice oder was auch immer, dann kehrt sie sofort zurück und lässt Ihr Programm anderen Code laufen während der Remote-Dienst eine Antwort sendet. Sobald die Antwort eintrifft, führt das System einen callback aus (entweder in Ihrer Nachrichtenschleife oder in einem separaten E / A-Beendigungs-Port-Thread, abhängig von der Umgebung), damit Ihr Code die Antwort verarbeiten kann.

Multi-Threading bedeutet, dass mehr als ein Ausführungs-Thread gleichzeitig ausgeführt wird. In diesem Modell sind alle Operationen immer noch synchron, aber die CPU führt mehrere Threads von synchronen Operationen zur gleichen Zeit aus.

Multi-Threading ist am sinnvollsten, wenn mehrere (und unabhängige) CPU-gebundene Operationen auf einem Multi-Core-processor aufgerufen werden. Zum Beispiel könnte ein Programm, das unabhängig jedes Pixel in einem Bild analysiert, das Bild in einen Streifen für jeden CPU-core aufteilen und dann jeden Streifen in seinem eigenen Thread zur gleichen Zeit analysieren.

Lesen Sie hier mehr – https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/