Dlaczego anulowane kontrakty terminowe Clojure nadal korzystają z procesora?

Mam wiele przykładów kodu bajtowego Java, z których wszystkie chciałbym wykonać z Clojure. Każda sekwencja kodu bajtowego może zawierać nieskończoną pętlę, w którym to przypadku chciałbym przestać ją uruchamiać po kilku sekundach. Patrzyłem na przyszłość jako sposób na to. Szukając kilku implementacji, wypróbowałem oba te kody:

(deref (future (loop[a 1] (recur a)) :done!) 1000 :impatient!)

... a także kod whttps://gist.github.com/3124000

W obu przypadkach pętla wydaje się być odpowiednio upłynięta (w tym drugim przypadku przyszłość została zgłoszona zarówno jako zakończona, jak i anulowana), ale widzę, że moje użycie procesora wzrasta do 99% lub w okolicy i pozostaje tam. Widzę również, że za każdym razem, gdy uruchamiam ten kod, mój proces Java zyskuje dodatkowy wątek.

Wygląda na to, że przyszłość jest anulowana, ale kod wciąż działa. W moim programie będę musiał uruchomić i przekroczyć limit czasu, bardzo ciasne pętle nieskończone (np. Odpowiednik kodu bajtowego Java „20 PRINT GOTO 10”) i nie mam możliwości modyfikacji kodu, który uruchamiam.

Wszelkie pomysły, dlaczego widzę to zachowanie; co mogę zrobić, aby temu zapobiec; lub alternatywne metody dla mnie, aby zrealizować mój cel uruchomienia i przekroczenia limitu czasu takiego kodu?

questionAnswers(3)

yourAnswerToTheQuestion