我有很多 Java 字节码示例,我想从 Clojure 执行所有这些示例。每个字节码序列都可能包含一个无限循环,在这种情况下,我想在几秒钟后停止运行它。我一直将期货视为这样做的一种手段。在寻找了几个实现之后,我尝试了这两个代码:
(deref (future (loop[a 1] (recur a)) :done!) 1000 :impatient!)
...以及https://gist.github.com/3124000上的代码
在这两种情况下,循环似乎都适当地超时(在后一种情况下,据报道未来已经完成并取消),但我看到我的 CPU 使用率上升到 99% 左右并保持在那里。我还看到每次运行此代码时,我的 Java 进程都会获得一个额外的线程。
在我看来,未来正在被取消,但代码仍在运行。在我的程序中,我需要运行并超时,一些非常紧凑的无限循环(例如,Java 字节码相当于“20 PRINT GOTO 10”),并且我没有修改我正在运行的代码的选项。
为什么我看到这种行为的任何想法;我能做些什么来防止它;或替代方法来实现我运行和超时此类代码的目标?