Ich verwende die Funktion race
aus dem async
-Paket, exportiert von Control.Concurrent.Async
.
Die Teilaufgaben, die ich mit race
selbst abfange, rufen runInteractiveProcess
auf, um ausführbare Dateien (nicht Haskell) auszuführen. Die Idee besteht darin, verschiedene externe Programme auszuführen und das Ergebnis des ersten zu beenden. In gewissem Sinne "orchestriert" Haskell eine Reihe externer Programme.
Was ich beobachte ist, dass race
korrekt funktioniert, indem der "langsamere" Thread der Haskell-Ebene gelöscht wird; Die aus dem langsamen Thread selbst erzeugten Subprozesse laufen weiter.
Ich vermute, dass das Warten auf race
Prozesse, die auf diese Weise erzeugt werden, zu töten, ist ein bisschen unrealistisch, da sie wahrscheinlich zu Zombies werden und von init geerbt werden. Für meine Zwecke jedoch verhindert die Aufrechterhaltung der externen Prozesse den gesamten Zweck der Verwendung von race
an erster Stelle.
Gibt es eine alternative Möglichkeit, race
zu verwenden, damit die auf diese Weise erstellten Subprozesse ebenfalls gelöscht werden? Obwohl ich noch keinen Anwendungsfall habe, wäre es am besten, wenn die gesamte Prozesskette, die mit den race
d-Aufgaben erstellt wurde, getötet wird. wie man sich vorstellen kann, dass diese externen Programme selbst eine Reihe von Prozessen erzeugen.
Wie bereits in den Kommentaren erwähnt, könnten Sie eine Kombination aus onException und terminateProcess .
Meine Prozess-Streaming -Bibliothek (die auf process und rohre ) tut dies bereits. Asynchrone Ausnahmen lösen den Abbruch des externen Prozesses aus.
Der folgende Code erstellt beispielsweise nicht die Datei toolate.txt
.
Das Ergebnis ist:
%Vor%Tags und Links haskell