什么会导致Clojure程序在完成main函数中的最后一个语句后不立即退出?
我所做的就是将(doall (map ...))
更改为(doall (pmap ...))
,突然程序在完成任务后会挂起很长时间,然后退出。我会在(println "Finished everything!")
函数的最后一行放置-main
,它会打印出来,但仍然不会退出一段时间。什么可能导致这种行为,我应该如何解决它?
编辑:pmap是并行化程序的唯一部分(主要是因为其他所有内容都或多或少地立即运行)。由于程序的后半部分需要pmap的所有结果才能正常运行,并且由于map和pmap的程序输出相同,我有点怀疑pmap在程序结束时仍会运行。将(System/exit 0)
放在最后而不是println也不会改变程序输出。
答案 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操作可能需要一些额外的时间才能完成代码。