我有很多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