У меня есть много примеров байт-кода Java, все из которых я хотел бы выполнить из Clojure. Каждая последовательность байт-кода может содержать бесконечный цикл, и в этом случае я бы хотел остановить его через пару секунд. Я рассматривал будущее как средство для этого. Охвативсь за пару реализаций, я пробовал и этот код:
(deref (future (loop[a 1] (recur a)) :done!) 1000 :impatient!)
... а также код https://gist.github.com/3124000
В обоих случаях цикл, как представляется, истекает соответствующим образом (и в последнем случае, как сообщается, будущее было сделано и отменено), но я вижу, что мой рост использования ЦП достигает 99% или около того и остается там. Я также вижу, что каждый раз, когда я запускаю этот код, мой Java-процесс получает дополнительный поток.
Мне кажется, что будущее отменяется, но код все еще работает. В моей программе мне нужно будет запустить и тайм-аут несколько очень плотных бесконечных циклов (например, эквивалент байт-кода Java "20 PRINT GOTO 10" ), и у меня нет возможности модифицировать код, который я запускаю.
Любые идеи, почему я вижу это поведение; что я мог сделать, чтобы предотвратить это; или альтернативные методы для реализации моей цели запуска и выключения такого кода?