完成最后一条语句时Clojure程序未退出?

完成最后一条语句时Clojure程序未退出?,clojure,Clojure,什么会导致Clojure程序在完成main函数中的最后一条语句后不会立即退出 我所做的只是将一个(doall(map…)更改为一个(doall(pmap…),突然程序在完成任务后会挂起好几秒钟,然后退出。我会在-main函数的最后一行放一个(println“Finished everything!”),它会打印出来,但在一段时间内仍然不会退出。什么会导致这种行为,我应该如何修复它 编辑:pmap是程序中唯一被并行化的部分(主要是因为其他部分或多或少都是即时运行的)。由于程序的后半部分需要pmap

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

我所做的只是将一个
(doall(map…)
更改为一个
(doall(pmap…)
,突然程序在完成任务后会挂起好几秒钟,然后退出。我会在
-main
函数的最后一行放一个
(println“Finished everything!”)
,它会打印出来,但在一段时间内仍然不会退出。什么会导致这种行为,我应该如何修复它

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

根据以下内容:

…pmap仅适用于计算密集型函数,其中 f的值控制协调开销


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

pmap
将从线程池中启动多个线程,以服务于您的并发任务

调用shutdown代理是允许JVM有序退出的必要条件,因为代理线程池中的线程不是守护进程线程

您需要明确地告诉他们正常关机(但仅当您的程序完成时)。这看起来以前已经得到了回答

引述该答案:

“您需要调用
shutdown agents
,以终止支持pmap使用的线程池的线程。”


文档在这里:

我想,当启动代码后,pmap不能完全完成其处理。如果没有更多的代码显示,很难说。可能是重复的我不介意被否决,但请至少给出一个解释。谢谢你的回答Jason,但我怀疑pmap没有完成其操作,因为我添加了问题的原因。你对这种行为还有其他想法吗?另外,仅供参考,我没有投你反对票。@ErrorUserName:没有其他建议。从外观上看不需要,这要感谢Scott Lowe提供的答案。很好的解决方案!我曾在多个项目中遇到过这个问题,在这些项目中,我将运行其他命令,并添加
(关机代理)
来修复它。大概
clojure.java.shell
正在使用某种其他线程来完成它的任务。