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