Erstellt ein asynchroner Aufruf immer einen neuen Thread? Was ist der Unterschied zwischen den beiden?
Erstellt oder verwendet ein asynchroner Aufruf immer einen neuen Thread?
Bei der Computerprogrammierung sind asynchrone Ereignisse solche, die unabhängig vom Hauptprogrammablauf auftreten. Asynchrone Aktionen sind Aktionen, die in einem nicht blockierenden Schema ausgeführt werden, sodass der Hauptprogrammfluss die Verarbeitung fortsetzen kann.
Ich weiß, dass asynchrone Aufrufe für einzelne Threads ausgeführt werden können. Wie ist das möglich?
multithreading
language-agnostic
asynchronous
Ted Smith
quelle
quelle
Antworten:
Diese Frage ist fast zu allgemein, um sie zu beantworten.
Im allgemeinen Fall erstellt ein asynchroner Aufruf nicht unbedingt einen neuen Thread. Dies ist eine Möglichkeit, dies zu implementieren, wobei ein bereits vorhandener Thread-Pool oder ein externer Prozess andere Möglichkeiten darstellen. Dies hängt stark von der Sprache, dem Objektmodell (falls vorhanden) und der Laufzeitumgebung ab.
Asynchron bedeutet nur, dass der aufrufende Thread nicht auf die Antwort wartet und die asynchrone Aktivität auch nicht im aufrufenden Thread stattfindet.
Darüber hinaus müssen Sie spezifischer werden.
quelle
Wenn für die asynchrone Operation keine CPU erforderlich ist, kann diese Operation ausgeführt werden, ohne dass ein weiterer Thread erzeugt wird. Wenn die asynchrone Operation beispielsweise E / A ist, muss die CPU nicht warten, bis die E / A abgeschlossen ist. Es muss nur den Vorgang starten und kann dann mit anderen Arbeiten fortfahren, während die E / A-Hardware (Festplattencontroller, Netzwerkschnittstelle usw.) die E / A-Arbeit erledigt. Die Hardware teilt der CPU mit, wann sie fertig ist, indem sie die CPU unterbricht, und das Betriebssystem sendet das Ereignis dann an Ihre Anwendung.
Häufig machen übergeordnete Abstraktionen und APIs die zugrunde liegenden asynchronen APIs, die vom Betriebssystem und der zugrunde liegenden Hardware verfügbar sind, nicht verfügbar. In diesen Fällen ist es normalerweise einfacher, Threads für asynchrone Vorgänge zu erstellen, selbst wenn der erzeugte Thread nur auf einen E / A-Vorgang wartet.
Wenn für die asynchrone Operation die CPU arbeiten muss, muss diese Operation im Allgemeinen in einem anderen Thread ausgeführt werden, damit sie wirklich asynchron ist. Selbst dann ist es wirklich nur asynchron, wenn es mehr als eine Ausführungseinheit gibt.
quelle
Nein, asynchrone Aufrufe beinhalten nicht immer Threads.
Sie starten normalerweise eine Operation, die parallel zum Anrufer fortgesetzt wird. Diese Operation kann jedoch von einem anderen Prozess, 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.
quelle
JavaScript ist Single-Threaded und asynchron. Wenn Sie beispielsweise XmlHttpRequest verwenden, stellen Sie ihm eine Rückruffunktion zur Verfügung, die asynchron ausgeführt wird, wenn die Antwort zurückgegeben wird.
John Resig hat eine gute Erklärung für die damit verbundene Frage, wie Timer in JavaScript funktionieren .
quelle
Multithreading bezieht sich auf mehr als eine Operation, die im selben Prozess ausgeführt wird. Während sich die asynchrone Programmierung über Prozesse erstreckt. Wenn meine Operationen beispielsweise einen Webdienst aufrufen, muss der Thread nicht warten, bis der Webdienst zurückkehrt. Hier verwenden wir die asynchrone Programmierung, mit der der Thread nicht auf den Abschluss eines Prozesses auf einem anderen Computer warten kann. Wenn eine Antwort vom Webservice angezeigt wird, kann der Hauptthread unterbrochen werden, um anzuzeigen, dass der Webdienst die Verarbeitung der Anforderung abgeschlossen hat. Jetzt kann der Haupt-Thread das Ergebnis verarbeiten.
quelle
Windows hatte seit den nicht präemptiven Zeiten (Versionen 2.13, 3.0, 3.1 usw.) immer eine asynchrone Verarbeitung unter Verwendung der Nachrichtenschleife, lange bevor echte Threads unterstützt wurden. Um Ihre Frage zu beantworten, nein, es ist nicht erforderlich, einen Thread zu erstellen, um eine asynchrone Verarbeitung durchzuführen.
quelle
Asynchrone Anrufe müssen nicht einmal auf demselben System / Gerät erfolgen wie derjenige, der den Anruf aufruft. Wenn die Frage lautet: Benötigt ein asynchroner Aufruf im aktuellen Prozess einen Thread, lautet die Antwort Nein. Es muss jedoch irgendwo ein Ausführungsthread vorhanden sein, der die asynchrone Anforderung verarbeitet.
Thread of Execution ist ein vager Begriff. In kooperativen Tasking-Systemen wie den frühen Macintosh- und Windows-Betriebssystemen kann der Ausführungsthread einfach derselbe Prozess sein, bei dem die Anforderung einen anderen Stapel, einen Befehlszeiger usw. ausführt. Wenn jedoch allgemein von asynchronen Aufrufen gesprochen wird Dies sind normalerweise Aufrufe, die von einem anderen Thread verarbeitet werden, wenn es sich um einen Prozess handelt (dh innerhalb desselben Prozesses), oder von einem anderen Prozess, wenn es sich um einen Interprozess handelt.
Beachten Sie, dass die Interprozess- (oder Interprozess-) Kommunikation (IPC) üblicherweise so verallgemeinert wird, dass sie die prozessinterne Kommunikation einschließt, da die Techniken zum Sperren und Synchronisieren von Daten normalerweise gleich sind, unabhängig davon, in welchem Prozess die einzelnen Ausführungsthreads ausgeführt werden.
quelle
Bei einigen Systemen können Sie die Parallelität im Kernel für einige Einrichtungen mithilfe von Rückrufen nutzen. In einem eher undurchsichtigen Fall wurden asynchrone E / A-Rückrufe verwendet, um nicht blockierende Internet-Server in den nicht präemptiven Multitasking-Tagen von Mac System 6-8 zu implementieren.
Auf diese Weise haben Sie gleichzeitige Ausführungsströme "in" Ihrem Programm ohne Threads als solche .
quelle
Asynchron bedeutet nur, dass Sie Ihr Programm nicht blockieren, während Sie darauf warten, dass etwas (Funktionsaufruf, Gerät usw.) beendet wird. Es kann in einem separaten Thread implementiert werden, es ist jedoch auch üblich, einen dedizierten Thread für synchrone Aufgaben zu verwenden und über eine Art Ereignissystem zu kommunizieren, um so ein asynchrones Verhalten zu erzielen.
Es gibt Beispiele für asynchrone Single-Thread-Programme. Etwas wie:
quelle
Die Art der asynchronen Aufrufen ist so , dass, wenn Sie die Anwendung wollen weiter ausgeführt werden , während der Anruf im Gange ist, werden Sie entweder brauchen Laichen einen neuen Thread oder zumindest verwenden einen anderen Thread, dass Sie für die Zwecke der allein geschaffen haben Behandlung von asynchronen Rückrufen.
Abhängig von der Situation möchten Sie manchmal eine asynchrone Methode aufrufen, sie dem Benutzer jedoch 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 .
quelle