Clojure программа не выходит при завершении последнего заявления?
Что вызовет немедленный выход программы Clojure после завершения последнего оператора в основной функции?
Все, что я сделал, это изменить (doall (map ...))
на (doall (pmap ...))
, и внезапно программа зависнет после завершения своих задач за большое количество секунд до выхода. Я бы поставил (println "Finished everything!")
в последнюю строку функции -main
, и он напечатает это, но все же не выйдет в течение некоторого времени. Что может вызвать это поведение и как его исправить?
EDIT: pmap является единственной частью программы, которая распараллеливается (главным образом потому, что все остальное работает более или менее мгновенно). Поскольку последние части программы требуют всех результатов от pmap для правильной работы, а так как выход программы одинаковый для обеих карт и pmap, я несколько сомневаюсь, что pmap все равно будет работать в конце программы. Помещение (System/exit 0)
в конец вместо println также не изменяет выход программы.
Ответы
Ответ 1
pmap
будет вращать несколько потоков из threadpool для обслуживания ваших параллельных задач.
Вызов агентов выключения необходим для того, чтобы JVM мог выйти упорядоченным образом, потому что потоки в потоках агента не являются потоками демона.
Вам нужно явно указать их на изящное завершение работы (но только тогда, когда ваша программа будет выполнена). На этот вопрос будет дан ответ до здесь.
Цитата из этого ответа:
"Вам нужно вызвать shutdown-agents
, чтобы убить потоки, поддерживающие threadpool, используемые pmap."
Документы находятся здесь: http://clojuredocs.org/clojure_core/1.3.0/clojure.core/shutdown-agents
Ответ 2
В соответствии с docs:
... [pmap is O] полезен для вычислительно интенсивных функций, где время of f доминирует над накладными расходами.
Таким образом, это означает, что для вашего сценария есть больше накладных расходов, используя pmap
, чем при использовании map
. Операции pmap, вероятно, занимают немного дополнительного времени, чтобы закончить до кода после pmap
.