Control.Concurrent.Async.race und runInteractiveProcess

8

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.

    
Levent Erkok 27.06.2014, 07:21
quelle

1 Antwort

5

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 .

%Vor%

Das Ergebnis ist:

%Vor%     
danidiaz 27.06.2014, 12:31
quelle

Tags und Links