Gibt es einen Weg in Haskell (mit GHC, wenn es darauf ankommt, für Code, der unter Linux und Windows laufen muss), beschränkte Berechnungen durchzuführen? Das heißt, "berechne das Ergebnis dieser Funktion, wenn es machbar ist, aber wenn der Versuch mehr als X CPU-Zyklen, Y-Stapelspeicher oder Z-Stapelspeicherplatz verwendet hat und immer noch nicht beendet ist, halte an und gebe einen Hinweis darauf zurück war es nicht möglich, die Berechnung abzuschließen "?
Hier ist eine hackische Lösung, die Sie ausprobieren könnten: Erzeugen Sie Ihre Berechnung mit forkIO
, und lassen Sie den übergeordneten Thread (oder einen Überwachungsthread, der Zugriff auf den ThreadId
des gegabelten Threads hat) regelmäßig abfragen jede Menge, die Sie wollen, und werfen Sie eine asynchrone Ausnahme auf den Computing-Thread wie nötig (interessanterweise, genau so funktioniert timeout
.)
Die nächste Frage wäre, ob es einen Weg gibt, herauszufinden, wie groß der Heap derzeit in Haskell ist. Gesamtspeicherverbrauch und Zyklen können Sie herausfinden, indem Sie Shell-Befehle erzeugen oder das Betriebssystem auf andere Weise abfragen (ich würde nicht wissen, wie man das unter Windows macht).
Es ist keine perfekte Lösung, aber es ist eine einfache Lösung, die Sie in ein paar Minuten implementieren und testen können.
Auf einer Pro-Prozess-Ebene können Sie die RTS-Optionen von GHC verwenden zur Steuerung der maximalen Stapel- und Heap-Größen.