我有很多Java字節碼的例子,我想從Clojure執行所有這些例子。每個字節碼序列可能包含一個無限循環,在這種情況下,我想在幾秒鐘後停止運行它。我一直在尋找期貨作爲這樣做的一種手段。已經獵殺周圍的一對夫婦實現的我都試過這個代碼:爲什麼取消的Clojure期貨繼續使用CPU?
(deref (future (loop[a 1] (recur a)) :done!) 1000 :impatient!)
...而且在https://gist.github.com/3124000
在這兩種情況下的代碼,循環似乎是適當的超時(和在後一種情況下,未來據報道已經完成並取消),但我看到我的CPU使用率上升到99%左右,並保持在那裏。我還看到,每次運行此代碼時,我的Java進程都會獲得額外的線程。
它看起來像我未來被取消,但代碼仍在運行。在我的程序中,我將需要運行並超時,出現一些非常緊密的無限循環(例如,「20 PRINT GOTO 10」的Java字節碼等價物),並且我沒有修改正在運行的代碼的選項。
任何想法,爲什麼我看到這種行爲;我能做些什麼來阻止它;或替代方法讓我實現我的目標,運行和超時此類代碼?
這看起來確實很有用,但是當我這樣做時(thunk-timeout(loop [a 0](recur a))10000)函數只是掛起而CPU上升...即使在10000ms之後也沒有超時。有任何想法嗎? – 2012-07-17 10:48:18
我很快就說過了;當我創建一個ThreadGroup並將它傳遞給你的thunk-timeout時,一個循環函數確實停止了。謝謝:) – 2012-07-17 19:31:40
爲什麼需要ThreadGroup,只需將它包裝在fn中就足夠了:) (thunk-timeout(fn [](loop [a 0](recur a))10000))) – o0omycomputero0o 2015-12-16 03:57:36