Clojure程序在完成最后一次声明时没有退出?

时间:2012-01-01 21:53:34

标签: clojure

什么会导致Clojure程序在完成main函数中的最后一个语句后不立即退出?

我所做的就是将(doall (map ...))更改为(doall (pmap ...)),突然程序在完成任务后会挂起很长时间,然后退出。我会在(println "Finished everything!")函数的最后一行放置-main,它会打印出来,但仍然不会退出一段时间。什么可能导致这种行为,我应该如何解决它?

编辑:pmap是并行化程序的唯一部分(主要是因为其他所有内容都或多或少地立即运行)。由于程序的后半部分需要pmap的所有结果才能正常运行,并且由于map和pmap的程序输出相同,我有点怀疑pmap在程序结束时仍会运行。将(System/exit 0)放在最后而不是println也不会改变程序输出。

2 个答案:

答案 0 :(得分:17)

pmap将从线程池中启动多个线程来为您的并发任务提供服务。

调用shutdown-agents是必要的,以允许JVM以有序的方式退出,因为代理线程池中的线程不是守护线程。

您需要明确告诉他们正常关闭(但仅在程序完成时)。这似乎已在here之前得到解答。

引用该答案:

“你需要调用shutdown-agents来杀死支持pmap使用的线程池的线程。”

文档在这里:http://clojuredocs.org/clojure_core/1.3.0/clojure.core/shutdown-agents

答案 1 :(得分:3)

根据docs

  

... [pmap对于计算密集型时间函数非常有用   f支配协调开销。

因此,这可能意味着您的方案使用pmap比使用map需要更多的开销。在pmap触发后,pmap操作可能需要一些额外的时间才能完成代码。