Почему отмененные фьючерсы Clojure продолжают использовать ЦП?

У меня есть много примеров байт-кода Java, каждый из которых я хотел бы выполнить из Clojure. Каждая последовательность байт-кода может содержать бесконечный цикл, и в этом случае я хотел бы прекратить его выполнение через пару секунд. Я рассматривал фьючерсы как средство для этого. Порыскав пару реализаций, я попробовал оба кода:

(deref (future (loop[a 1] (recur a)) :done!) 1000 :impatient!)

...а также код вhttps://gist.github.com/3124000

В обоих случаях время цикла истекло надлежащим образом (, а в последнем случае сообщается, что будущее было выполнено и отменено ), но я вижу, что загрузка ЦП возрастает до 99% или около того, и остается на этом уровне.. Я также вижу, что каждый раз, когда я запускаю этот код, мой Java-процесс получает дополнительный поток.

Мне кажется, что будущее отменяется, но код все еще работает. В моей программе мне нужно будет запустить и истечь время, некоторые очень тесные бесконечные циклы (, например. байт-код Java, эквивалентный «20 PRINT GOTO 10» ), и у меня нет возможности изменить код, который я запускаю.

Любые идеи, почему я вижу такое поведение; что я мог сделать, чтобы предотвратить это; или альтернативные методы для меня, чтобы реализовать мою цель запуска и тайм-аута такого кода?

18
задан Tom Hume 17 July 2012 в 10:16
поделиться