Wie kann man den Unterschied zwischen asynchroner und paralleler Programmierung ausdrücken?

138

Viele Plattformen fördern Asynchronität und Parallelität als Mittel zur Verbesserung der Reaktionsfähigkeit. Ich verstehe den Unterschied im Allgemeinen, finde es aber oft schwierig, ihn in meinem eigenen Kopf und für andere zu artikulieren.

Ich bin ein Workaday-Programmierer und benutze ziemlich oft Async & Callbacks. Parallelität fühlt sich exotisch an.

Aber ich habe das Gefühl, dass sie leicht zusammengeführt werden können, insbesondere auf der Ebene des Sprachdesigns. Würde gerne eine klare Beschreibung ihrer Beziehung (oder nicht) und der Klassen von Programmen, in denen jedes am besten angewendet wird.

Matt Sherman
quelle
Ich schrieb einen Blog-Beitrag über die Beziehung zwischen asynchroner und paralleler Programmierung - anat-async.blogspot.com/2018/08/…
Alexei Kaigorodov
6
Parallelität ist, wenn Dinge gleichzeitig passieren. Asynchronität ist, wenn Sie nicht darauf warten müssen, dass das Ergebnis einer Aktion fortgesetzt wird. Du gehst einfach schlafen und irgendwann später kommt das Ergebnis, klingelt, du wachst auf und machst von dort aus weiter. Die asynchrone Ausführung kann perfekt seriell nur in einem Thread erfolgen. (das ist so ziemlich das, was Javascript macht)
Thanasis Ioannidis

Antworten:

87

Wenn Sie etwas asynchron ausführen, bedeutet dies, dass es nicht blockiert ist. Sie führen es aus, ohne darauf zu warten, dass es abgeschlossen ist und mit anderen Dingen fortfährt. Parallelität bedeutet, mehrere Dinge gleichzeitig parallel auszuführen. Parallelität funktioniert gut, wenn Sie Aufgaben in unabhängige Arbeiten aufteilen können.

Nehmen Sie zum Beispiel das Rendern von Frames einer 3D-Animation. Das Rendern der Animation dauert lange. Wenn Sie das Rendern in Ihrer Animationsbearbeitungssoftware starten, stellen Sie sicher, dass es asynchron ausgeführt wird, damit Ihre Benutzeroberfläche nicht blockiert wird und Sie andere Aufgaben ausführen können. Jetzt kann jeder Frame dieser Animation auch als einzelne Aufgabe betrachtet werden. Wenn mehrere CPUs / Cores oder mehrere Computer verfügbar sind, können wir mehrere Frames parallel rendern , um die Gesamtauslastung zu beschleunigen.

CodeMan
quelle
Lassen Sie mich sehen, ob ich das bekomme. Die parallelen Aufgaben zum Rendern der verschiedenen Frames sollten auf mehrere CPUs / Kerne verteilt sein. Das hat nichts mit dem Zeitpunkt des Abschlusses der Aufgabe zu tun oder damit, ob diese Aufgabe etwas anderes blockiert. Es bedeutet nur, dass eine Reihe von CPUs dies zusammen tun und das Ergebnis verfügbar machen, als ob es auf einer superschnellen CPU laufen würde. Richtig?
1
"Das Rendern der Animation dauert lange. Wenn Sie das Rendern also über Ihre Animationsbearbeitungssoftware starten, stellen Sie sicher, dass (...)". Was?
Für den 3D-Animationsteil: Zunächst einmal würden Sie NIEMALS ein 3D-Grafikprogramm mit der Erzeugung von Frames auf der CPU ausführen - jede vernünftige Person würde sofort die Verwendung der GPU vorschlagen. Zweitens, wenn wir dies tun (sehr entmutigt), würden wir einen Timer verwenden, um zu messen, wie viele Frames wir rendern können, andernfalls könnten wir nur einen Stapel unvollendeter Renderaufrufaufgaben aufbauen. Ihr Standpunkt ist jedoch bei den meisten 2D-Rendering-Anwendungen, die auf Benutzereingabeereignisbasis gerendert werden, vollkommen gültig.
イ き ん
1
Asynchron und nicht blockierend sind unterschiedliche Paradigmen.
Marquis von Lorne
72

Ich glaube, der Hauptunterschied besteht zwischen Parallelität und Parallelität .

Async und Callbacks sind im Allgemeinen eine Möglichkeit (Tool oder Mechanismus), um Parallelität auszudrücken, dh eine Reihe von Entitäten, die möglicherweise miteinander kommunizieren und Ressourcen gemeinsam nutzen. Im Fall von Async oder Rückruf ist die Kommunikation implizit, während die gemeinsame Nutzung von Ressourcen optional ist (berücksichtigen Sie RMI, wenn die Ergebnisse auf einem Remotecomputer berechnet werden). Wie richtig bemerkt, erfolgt dies normalerweise unter Berücksichtigung der Reaktionsfähigkeit. nicht auf Ereignisse mit langer Latenz warten .

Die parallele Programmierung hat normalerweise den Durchsatz als Hauptziel, während die Latenz, dh die Fertigstellungszeit für ein einzelnes Element, möglicherweise schlechter ist als bei einem äquivalenten sequentiellen Programm.

Um die Unterscheidung zwischen Parallelität und Parallelität besser zu verstehen, zitiere ich aus probabilistischen Modellen für die Parallelität von Daniele Varacca, die eine gute Reihe von Anmerkungen zur Theorie der Parallelität sind:

Ein Berechnungsmodell ist ein Modell für die Parallelität, wenn es Systeme darstellen kann, die aus unabhängigen autonomen Komponenten bestehen und möglicherweise miteinander kommunizieren. Der Begriff der Parallelität sollte nicht mit dem Begriff der Parallelität verwechselt werden. Parallele Berechnungen beinhalten normalerweise eine zentrale Steuerung, die die Arbeit auf mehrere Prozessoren verteilt. Gleichzeitig betonen wir die Unabhängigkeit der Komponenten und die Tatsache, dass sie miteinander kommunizieren. Parallelität ist wie im alten Ägypten, wo der Pharao entscheidet und die Sklaven arbeiten. Parallelität ist wie im modernen Italien, wo jeder tut, was er will, und alle Mobiltelefone benutzen.

Zusammenfassend ist die parallele Programmierung ein Sonderfall der Parallelität, bei dem separate Einheiten zusammenarbeiten, um (im Allgemeinen) eine hohe Leistung und einen hohen Durchsatz zu erzielen.

Async und Callbacks sind nur ein Mechanismus, mit dem der Programmierer Parallelität ausdrücken kann. Bedenken Sie, dass bekannte Entwurfsmuster für die parallele Programmierung wie Master / Worker oder Map / Reduce von Frameworks implementiert werden, die solche Mechanismen auf niedrigerer Ebene (asynchron) verwenden, um komplexere zentralisierte Interaktionen zu implementieren .

igon
quelle
37

Dieser Artikel erklärt es sehr gut: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

Es hat dies über asynchrone Programmierung:

Asynchrone Aufrufe werden verwendet, um das Blockieren innerhalb einer Anwendung zu verhindern. Ein solcher Aufruf wird in einem bereits vorhandenen Thread (z. B. einem E / A-Thread) ausgegliedert und erledigt seine Aufgabe, wenn dies möglich ist.

dies über parallele Programmierung:

Bei der parallelen Programmierung werden Arbeit oder Aufgaben immer noch aufgeteilt, aber der Hauptunterschied besteht darin, dass Sie für jeden Arbeitsabschnitt neue Threads erstellen

und dies zusammenfassend:

asynchrone Aufrufe werden verwenden Threads bereits in Verwendung durch das System und die parallele Programmierung erfordert die Entwickler die Arbeit auf, spinup und Teardown - Threads benötigt , zu brechen .

Paul
quelle
3
Dieser Artikel> alle Antworten hier (außer diesem natürlich!)
FellyTone84
1
Danke für den Link. Verwenden Sie also im Allgemeinen asynchrone Aufrufe, wenn Sie von der Benutzeroberfläche zum Server (oder von einem Client zu einem Webdienst) kommunizieren. Verwenden Sie paralleles Threading auf der Server- oder Webdienstseite sowie in Ihrer Geschäftsschicht.
goku_da_master
18

Mein Grundverständnis ist:

Die asynchrone Programmierung löst das Problem, dass Sie warten müssen, bis ein teurer Vorgang abgeschlossen ist, bevor Sie etwas anderes tun können. Wenn Sie andere Dinge erledigen können, während Sie auf den Abschluss der Operation warten, ist das eine gute Sache. Beispiel: Halten Sie eine Benutzeroberfläche am Laufen, während Sie weitere Daten von einem Webdienst abrufen.

Parallele Programmierung ist verwandt, befasst sich jedoch eher mit der Aufteilung einer großen Aufgabe in kleinere Blöcke, die gleichzeitig berechnet werden können. Die Ergebnisse der kleineren Stücke können dann kombiniert werden, um das Gesamtergebnis zu erhalten. Beispiel: Raytracing, bei dem die Farbe einzelner Pixel im Wesentlichen unabhängig ist.

Es ist wahrscheinlich komplizierter als das, aber ich denke, das ist die grundlegende Unterscheidung.

Andrew Cooper
quelle
Das ist schön ausgedrückt, aber es ist völlig falsch. Wie bei der Asynchronität ermöglicht auch die Parallelität, dass der Steuerungsfluss fortgesetzt wird, ohne auf den Abschluss von Aktionen zu warten. Der Hauptunterschied besteht darin, dass die Parallelität von der Hardware abhängt.
Serkan
13

Ich neige dazu, an den Unterschied in diesen Begriffen zu denken:

Asynchron: Geh weg und erledige diese Aufgabe, wenn du fertig bist, komm zurück und sag es mir und bring die Ergebnisse. Ich werde in der Zwischenzeit mit anderen Dingen weitermachen.

Parallel: Ich möchte, dass Sie diese Aufgabe erledigen. Wenn es einfacher ist, holen Sie sich ein paar Leute, die Ihnen helfen. Dies ist jedoch dringend erforderlich, daher werde ich hier warten, bis Sie mit den Ergebnissen zurückkommen. Ich kann nichts anderes tun, bis du zurückkommst.

Natürlich kann eine asynchrone Aufgabe Parallelität verwenden, aber die Unterscheidung - zumindest meiner Meinung nach - besteht darin, ob Sie während der Operation mit anderen Dingen weitermachen oder ob Sie alles vollständig stoppen, bis die Ergebnisse vorliegen.

Leonard H. Martin
quelle
13

async : Mach das alleine woanders und benachrichtige mich, wenn du fertig bist (Rückruf). Bis ich mein Ding weiter machen kann.

Geben Sie hier die Bildbeschreibung ein

Parallel : Stellen Sie so viele Leute (Threads) ein, wie Sie möchten, und teilen Sie den Job auf sie auf, um ihn schneller abzuschließen, und lassen Sie mich wissen (Rückruf), wenn Sie fertig sind. Bis ich vielleicht meine anderen Sachen weiter mache.

Geben Sie hier die Bildbeschreibung ein

Der Hauptunterschied besteht darin, dass die Parallelität hauptsächlich von der Hardware abhängt.

serkan
quelle
11

Es ist eine Frage der Reihenfolge der Ausführung.

Wenn A mit B asynchron ist, kann ich nicht vorher vorhersagen, wann Unterteile von A in Bezug auf Unterteile von B auftreten werden.

Wenn A parallel zu B ist, geschehen die Dinge in A gleichzeitig mit den Dingen in B. Es kann jedoch immer noch eine Ausführungsreihenfolge definiert werden.

Vielleicht liegt die Schwierigkeit darin, dass das Wort asynchron nicht eindeutig ist.

Ich führe eine asynchrone Aufgabe aus, wenn ich meinem Butler sage, er solle zum Laden laufen, um mehr Wein und Käse zu holen, ihn dann vergessen und an meinem Roman arbeiten, bis er wieder an die Studiertür klopft. Hier findet Parallelität statt, aber der Butler und ich beschäftigen uns mit grundlegend unterschiedlichen Aufgaben und unterschiedlichen sozialen Schichten. Deshalb wenden wir dieses Label hier nicht an.

Mein Dienstmädchenteam arbeitet parallel, wenn jedes von ihnen ein anderes Fenster wäscht.

Mein Rennwagen-Support-Team ist asynchron parallel, da jedes Team an einem anderen Reifen arbeitet und während seiner Arbeit nicht miteinander kommunizieren oder gemeinsame Ressourcen verwalten muss.

Meine Fußballmannschaft (auch bekannt als Fußballmannschaft) arbeitet parallel, da jeder Spieler unabhängig Informationen über das Spielfeld verarbeitet und sich darauf bewegt. Sie sind jedoch nicht vollständig asynchron, da sie kommunizieren und auf die Kommunikation anderer reagieren müssen.

Meine Blaskapelle ist auch parallel, da jeder Spieler Musik liest und sein Instrument steuert, aber sie sind sehr synchron: Sie spielen und marschieren im Takt zueinander.

Eine Nocken-Gatling-Pistole könnte als parallel betrachtet werden, aber alles ist zu 100% synchron, so dass es so ist, als würde sich ein Prozess vorwärts bewegen.

Richard
quelle
9

Warum asynchron?

Da die heutige Anwendung immer mehr vernetzte und möglicherweise auch lange laufende Aufgaben oder blockierende Vorgänge wie Netzwerk-E / A oder Datenbankvorgänge ausführt, ist es sehr wichtig, die Latenz dieser Vorgänge zu verbergen, indem Sie sie im Hintergrund starten und zur Benutzeroberfläche zurückkehren so schnell wie möglich. Hier kommt Asynchron ins Bild: Reaktionsfähigkeit .

Warum parallele Programmierung?

Da die heutigen Datensätze immer größer und die Berechnungen immer komplexer werden. In diesem Fall ist es sehr wichtig, die Ausführungszeit dieser CPU-gebundenen Vorgänge zu verkürzen, indem die Arbeitslast in Blöcke aufgeteilt und diese Blöcke dann gleichzeitig ausgeführt werden. Wir können dies als "Parallel" bezeichnen. Offensichtlich wird es unserer Anwendung eine hohe Leistung verleihen .

Code-EZ
quelle
5

Asynchron Angenommen, Sie sind der Ansprechpartner für Ihren Kunden und müssen reaktionsschnell sein, dh Sie müssen den Status, die Komplexität des Betriebs, die erforderlichen Ressourcen usw. teilen, wenn Sie dazu aufgefordert werden. Jetzt müssen Sie einen zeitaufwändigen Vorgang ausführen und können diesen nicht mehr ausführen, da Sie rund um die Uhr auf den Client reagieren müssen. Daher delegieren Sie den zeitaufwändigen Vorgang an eine andere Person, damit Sie darauf reagieren können. Dies ist asynchron.

Parallele Programmierung Angenommen, Sie haben eine Aufgabe, beispielsweise 100 Zeilen aus einer Textdatei zu lesen, und das Lesen einer Zeile dauert 1 Sekunde. Daher benötigen Sie 100 Sekunden, um die Textdatei zu lesen. Jetzt haben Sie Angst, dass der Client 100 Sekunden warten muss, bis der Vorgang abgeschlossen ist. Daher erstellen Sie 9 weitere Klone und lassen jeden von ihnen 10 Zeilen aus der Textdatei lesen. Jetzt dauert es nur noch 10 Sekunden, um 100 Zeilen zu lesen. Somit haben Sie eine bessere Leistung.

Zusammenfassend wird eine asynchrone Codierung durchgeführt, um eine Reaktionsfähigkeit zu erreichen, und eine parallele Programmierung wird durchgeführt, um die Leistung zu verbessern.

Varun Shridhar
quelle
4

Asynchron: Ausführen einer Methode oder Aufgabe im Hintergrund, ohne zu blockieren. Darf nicht unbedingt auf einem separaten Thread ausgeführt werden. Verwendet Kontextumschaltung / Zeitplanung.

Parallele Aufgaben: Jede Aufgabe wird parallel ausgeführt. Verwendet keine Kontextumschaltung / Zeitplanung.

Aditya Bokade
quelle
4

Ich kam mit den beiden Konzepten ziemlich zufrieden, aber mit etwas, das mir nicht klar war.

Nachdem ich einige der Antworten gelesen habe, denke ich, dass ich eine korrekte und hilfreiche Metapher habe, um den Unterschied zu beschreiben.

Wenn Sie sich Ihre einzelnen Codezeilen als separate, aber geordnete Spielkarten vorstellen (halten Sie mich an, wenn ich erkläre, wie Lochkarten der alten Schule funktionieren), haben Sie für jede separate Prozedur einen eindeutigen Kartenstapel (nicht Kopieren & Einfügen!) und der Unterschied zwischen dem, was normalerweise passiert, wenn Code normal und asynchron ausgeführt wird, hängt davon ab, ob Sie sich darum kümmern oder nicht.

Wenn Sie den Code ausführen, übergeben Sie dem Betriebssystem eine Reihe von Einzeloperationen (in die Ihr Compiler oder Interpreter Ihren Code auf "höherer" Ebene unterteilt hat), die an den Prozessor übergeben werden sollen. Mit einem Prozessor kann jeweils nur eine Codezeile ausgeführt werden. Um die Illusion zu erzeugen, mehrere Prozesse gleichzeitig auszuführen, verwendet das Betriebssystem eine Technik, bei der der Prozessor nur wenige Zeilen von einem bestimmten Prozess gleichzeitig sendet und zwischen allen Prozessen wechselt, je nachdem, wie er es sieht passen. Das Ergebnis sind mehrere Prozesse, die dem Endbenutzer den Fortschritt zur gleichen Zeit anzeigen.

Für unsere Metapher besteht die Beziehung darin, dass das Betriebssystem die Karten immer mischt, bevor sie an den Prozessor gesendet werden. Wenn Ihr Kartenstapel nicht von einem anderen Stapel abhängt, bemerken Sie nicht, dass Ihr Stapel nicht mehr ausgewählt wurde, während ein anderer Stapel aktiv wurde. Also, wenn es dich nicht interessiert, ist es egal.

Wenn Sie sich jedoch darum kümmern (z. B. gibt es mehrere Prozesse - oder Stapel von Karten -, die voneinander abhängen), wird das Mischen des Betriebssystems Ihre Ergebnisse durcheinander bringen.

Das Schreiben von asynchronem Code erfordert die Behandlung der Abhängigkeiten zwischen der Ausführungsreihenfolge, unabhängig davon, wie diese Reihenfolge letztendlich lautet. Aus diesem Grund werden Konstrukte wie "Rückrufe" verwendet. Sie sagen dem Prozessor: "Als nächstes müssen Sie dem anderen Stapel mitteilen, was wir getan haben." Durch die Verwendung solcher Tools können Sie sicher sein, dass der andere Stapel benachrichtigt wird, bevor das Betriebssystem weitere Anweisungen ausführen kann. ("Wenn called_back == false: send (no_operation)" - nicht sicher, ob dies tatsächlich so implementiert ist, aber logischerweise denke ich, dass es konsistent ist.)

Bei parallelen Prozessen besteht der Unterschied darin, dass Sie zwei Stapel haben, die sich nicht umeinander kümmern, und zwei Mitarbeiter, die sie verarbeiten. Am Ende des Tages müssen Sie möglicherweise die Ergebnisse der beiden Stapel kombinieren, was dann eine Frage der Synchronität wäre, aber für die Ausführung ist es Ihnen egal.

Ich bin mir nicht sicher, ob dies hilft, aber ich finde immer mehrere Erklärungen hilfreich. Beachten Sie außerdem, dass die asynchrone Ausführung nicht auf einen einzelnen Computer und seine Prozessoren beschränkt ist. Im Allgemeinen handelt es sich um Zeit oder (noch allgemeiner) um eine Reihenfolge von Ereignissen. Wenn Sie also den abhängigen Stapel A an den Netzwerkknoten X und den gekoppelten Stapel B an Y senden, sollte der richtige asynchrone Code die Situation berücksichtigen können, als würde er lokal auf Ihrem Laptop ausgeführt.

Philrea
quelle
2

Im Allgemeinen gibt es nur zwei Möglichkeiten, wie Sie jedes Mal mehr als eine Sache tun können. Einer ist asynchron , der andere ist parallel .

Auf hoher Ebene nutzen beide , wie der beliebte Server NGINX und die berühmte Python- Bibliothek Tornado , das asynchrone Paradigma, dass ein Single-Thread-Server gleichzeitig Tausende von Clients bedienen kann (einige IOloop und Callback ). Verwendung von ECF (Exception Control Follow), das das asynchrone Programmierparadigma implementieren könnte. so asynchron macht manchmal nicht wirklich gleichzeitig, aber einige io-gebundene Arbeiten, asynchron, könnten die Leistung wirklich fördern.

Das parallele Paradigma bezieht sich immer auf Multithreading und Multiprocessing. Dies kann Multi-Core-Prozessoren voll ausnutzen und die Dinge wirklich gleichzeitig erledigen.

ideoutrea
quelle
-1

Zusammenfassung aller oben genannten Antworten

  1. Paralleles Rechnen:

▪ Behebt das Durchsatzproblem. Betroffen davon, eine große Aufgabe in kleinere Teile zu zerlegen

▪ ist maschinenbezogen (Multi-Maschine / Kern / CPU / Prozessor erforderlich), zB: Master-Slave, Kartenreduzierung.

Parallele Berechnungen beinhalten normalerweise eine zentrale Steuerung, die die Arbeit auf mehrere Prozessoren verteilt

  1. asynchron:

▪ Behebt das Latenzproblem, dh das Problem, auf einen teuren Vorgang zu warten, bevor Sie etwas anderes tun können

▪ ist threadbezogen (Multi-Thread erforderlich)

Threading (mit Thread, Runnable, Executor) ist eine grundlegende Möglichkeit, asynchrone Operationen in Java auszuführen

Vyshnav Ramesh Thrissur
quelle