私はJavaバイトコードの例をたくさん持っていますが、それらはすべてClojureから実行したいと思います。バイトコードの各シーケンスには無限ループが含まれている可能性があります。その場合、数秒後に実行を停止します。私はこれを行う手段として先物を見てきました。いくつかの実装を探し回ったので、次の両方のコードを試しました。
(deref (future (loop[a 1] (recur a)) :done!) 1000 :impatient!)
...またhttps://gist.github.com/3124000のコード
どちらの場合も、ループは適切にタイムアウトしているように見えます(後者の場合、将来は完了してキャンセルされたと報告されています)が、CPU使用率が99%前後に上昇し、そこにとどまっています。また、このコードを実行するたびに、Javaプロセスが余分なスレッドを取得することもわかります。
将来はキャンセルされているように見えますが、コードはまだ実行されています。私のプログラムでは、いくつかの非常にタイトな無限ループ(たとえば、「20 PRINT GOTO 10」に相当するJavaバイトコード)を実行してタイムアウトする必要があり、実行しているコードを変更するオプションがありません。
私がこの振る舞いを見ている理由についての考え。それを防ぐために私ができること。または、そのようなコードを実行してタイムアウトするという私の目的を実現するための代替方法はありますか?