Was wäre der beste Weg, um Fehler in parallelen Programmen zu behandeln?


11

Wenn parallele Algorithmen an die Tür klopfen, ist es möglicherweise ein guter Zeitpunkt, über die Fehlerbehandlung nachzudenken.

Zuerst gab es also Fehlercodes. Die saugten. Es war kostenlos, sie zu ignorieren, sodass Sie spät ausfallen und schwer zu debuggenden Code erstellen konnten.

Dann kamen Ausnahmen. Es wurde unmöglich gemacht, diese zu ignorieren, sobald sie auftreten, und die meisten Menschen (außer Joel) mögen sie besser.

Und jetzt haben wir Bibliotheken, die parallelen Code unterstützen. Das Problem ist, dass Sie Ausnahmen im parallelen Code nicht so einfach behandeln können wie im nicht parallelen Code. Wenn Sie eine Aufgabe asynchron starten und sie eine Ausnahme auslöst, gibt es keine Stapelverfolgung, an der Sie sich abwickeln können. Das Beste, was Sie tun können, ist, es zu erfassen und im Aufgabenobjekt zu registrieren, wenn es ein solches Objekt gibt. Die primäre Stärke von Ausnahmen wird jedoch zunichte gemacht: Sie müssen nach ihnen suchen und können sie ohne zusätzlichen Aufwand ignorieren , während eine Ausnahme im Single-Thread-Code notwendigerweise die entsprechenden Aktionen auslöst (selbst wenn dies das Beenden Ihres Programms bedeutet).

Wie sollten Sprachimplementierungen oder Bibliotheken Fehler im parallelen Code unterstützen?


2
Sollte dies nicht zum Stackoverflow gehören ?
Graviton

@Ngu Soon Hui Es ist subjektiv und es geht um Funktionen, die nicht unbedingt existieren, also denke ich, dass es hierher gehört.
Zneak

Aber es geht um Programmierung, nicht um Programmierer. :)
bzlm

1
In den häufig gestellten Fragen zu @bzlm heißt es: "Programmierer - Stack Exchange ist für erfahrene Programmierer gedacht, die an subjektiven Diskussionen zur Softwareentwicklung interessiert sind." und SO entmutigt ausdrücklich subjektive Diskussionen.
Zneak

Antworten:


2

Ich bin eher gern Rückrufe für Fehler , die können behandelt werden. Und sie können dazu gebracht werden, asynchron gut zu funktionieren ...

Aber für Fehler, die nicht behandelt werden können, wirklich außergewöhnliche Fehler, möchte ich lieber die relevanten Informationen speichern und das Programm beenden. Da dies normalerweise sowieso über eine Art globalen Fehlerbehandler erfolgt, sehe ich keine Notwendigkeit, Ausnahmen in etwas zu verwandeln, das dafür funktioniert - aber eine bessere Plattformunterstützung zum Erkennen kritischer Fehler und zum Erstellen von Speicherabbildern usw. wäre hilfreich.


Ich zweite Rückrufe. Die obige Idee scheint mir ziemlich perfekt zu sein.
Pax Noctis

-2

Anscheinend möchten Sie sicherstellen, dass die Aufgabe ihre eigenen Ausnahmen behandelt, und dann etwas zurückgeben, das das aufrufende Programm darüber informiert, dass der Thread heruntergefahren werden muss. Es wäre dann logisch, das Ergebnis aller Threads zu verarbeiten, da man weiß, dass einige dieser Threads fehlgeschlagen sind.


5
"etwas zurückgeben" - an wen? Der Anrufer ist bereits weitergezogen.
Mark H

Wie @sparkie sagte, kann man das nicht einfach machen. Selbst wenn Sie den Aufrufstapel als Root für die Coroutine behalten, ist der Anrufer wahrscheinlich weit weg. Wie bereits erwähnt, wurden Ausnahmen entworfen , so dass sie Ihr Stop - Programm , jetzt . Wenn Sie es später selbst überprüfen, wird es vollständig besiegt, da Ausnahmen unbemerkt bleiben können.
Zneak

@Zneak, ich nehme an, als ich Ausnahmen erwähnte, bei denen ich Ihre (Standard-) Definition nicht verwendete, meinte ich nur, dass der Fehler abgefangen wurde. Nachdem eine Funktion beendet wurde, muss sie irgendwohin zurückkehren. An diesem Punkt kann die "Ausnahme" / der Fehler (auf dieser Ebene) behoben werden. Ich bin mir nicht sicher, warum ihr euch darauf bezieht, dass das aufrufende Programm weit weg ist. Jeder Rückgabewert der Funktion muss auf irgendeine Weise behandelt werden. Mir ist klar, dass dies bei weitem nicht so gut funktioniert, wenn die Ergebnisse der Fäden abhängig voneinander ineinander greifen.

1
Nicht alle parallelen Aufgaben "kehren" irgendwo zurück. Sie können beispielsweise eine lange Aufgabe einfach an einen separaten Thread delegieren, während Sie (fälschlicherweise) etwas anderes im Hauptthread ausführen, ohne sich jemals zu fragen, ob sie korrekt ausgeführt wurde. Zum Beispiel könnte ich eine Image Edition-Software schreiben, die aus einem sekundären Thread in Dateien schreibt, und vom Speicherdialog zurückkehren, sobald die Aufgabe gestartet wird. Ich brauche den Rückgabewert, was auch immer er ist, für keine weitere Operation. Abgesehen von Fehlern gibt es keinen Grund, ihn zu überprüfen.
Zneak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.