clojure (mit Zeitüberschreitung ... Makro)

8

Ich suche nach einem Makro, das eine Ausnahme auslöst, wenn ein Ausdruck länger als X Sekunden dauert.

    
Arthur Ulfeldt 05.11.2009, 21:17
quelle

3 Antworten

21

Diese Frage hat hier bessere Antworten: Ausführen einer Funktion mit einem Timeout

Futures zur Rettung!

%Vor%

Und um daraus ein Makro zu machen:

%Vor%

So können Sie das tun:

%Vor%     
Timothy Pratley 06.11.2009, 02:12
quelle
2

Ich bin mir nicht sicher, ob dies möglich ist, ohne den Ausdruck in einem separaten Thread auszuführen. Wenn der Thread den Ausdruck verarbeitet, können Sie keinen Code einfügen, um eine Ausnahme auszulösen.

Eine Version mit einem Monitor-Thread, der eine Exception auslöst, wenn der Ausdruck zu lange dauert, ist definitiv möglich. Die ausgelöste Exception stammt jedoch vom Monitor-Thread und nicht vom Thread, in dem der Ausdruck ausgeführt wird. Dann würde es keine Möglichkeit geben, es anzuhalten, ohne dem Thread einen Interrupt zu senden, den es möglicherweise ignoriert, wenn Sie nicht im Ausdruck dafür codiert haben.

Wenn es akzeptabel ist, eine Version zu haben, die den Ausdruck in einem separaten Thread ausführt, lassen Sie es mich wissen und ich kann einen Beispielcode posten. Andernfalls klingt Ihre beste Wette so, als würde man die Hauptschleife / Rekursion des Ausdrucks so schreiben, dass sie prüft, wie lange sie bei jeder Iteration gedauert hat, und eine Ausnahme auslöst, wenn sie die Grenze überschreitet. Entschuldigung, wenn das nicht ganz das ist, was du brauchst ...

    
levand 05.11.2009 21:59
quelle
1

Ich bin kürzlich auf diesen Thread gestoßen, als ich dieselbe Frage gestellt habe. Ich war mit den gegebenen Antworten nicht völlig zufrieden, deshalb habe ich eine alternative Lösung zusammengeschustert. Diese Lösung wird Ihren Code im aktuellen Thread und Spin einer Zukunft ausführen, um ihn nach einem festgelegten Timeout in ms zu unterbrechen.

%Vor%

Sie würden es in Ihrem Code so verwenden:

%Vor%

ODER

%Vor%

Beachten Sie, dass your-code nicht die InterruptedException abfangen darf, die zum Auslösen der TimeoutException verwendet wird. Ich benutze dies zum Testen und es funktioniert gut.

Siehe Thread.interrupt() javadoc für zusätzliche Vorbehalte.

Sie können diesen Code in hier sehen.

    
neatonk 04.01.2013 13:44
quelle

Tags und Links