Как остановить сиротскую ветку в clojure REPL
Я делаю что-то, связанное с потоком с clojure.
Сейчас я работаю в REPL, пишу и обновляю код в REPL.
Моя проблема в том, что когда-нибудь останется какое-то будущее. И я потерял рефери из-за каких-то ошибок. Мой единственный способ остановить их - перезапустить репл.
Я хочу знать, есть ли способы остановить работающие фьючерсы (потоки), если у меня нет ссылок на них?
1 ответ
Открытый API Clojure предоставляет единственный способ остановить запуск фьючерсов:
(shutdown-agents)
Но это не помешает вашей будущей работе. Вместо этого вы можете прервать их
(import 'clojure.lang.Agent)
(.shutdownNow Agent/soloExecutor)
Но имейте в виду, что после описанных операций ваш Agent/soloExecutor
не будет принимать новые задачи. Один из способов справиться с этим - переназначить soloExecutor
Java-поле в классе агента. Надеюсь, это публично и не окончательно.
(import 'java.util.concurrent.Executors)
(set! Agent/soloExecutor (Executors/newCachedThreadPool)) ;; in original clojure version thread pool is created with thread factory, but that createThreadFactory method is private, anyways for your purposes this code may work just fine without any thread factories.
(future (Thread/sleep 1000) (println "done") 100) ;; now works fine
Но на мой взгляд это не рекомендуемый способ сделать вещи в репл. Лучше не терять ваши будущие ссылки.