【问题标题】:Clojure program not exiting when finishing last statement?Clojure程序在完成最后一条语句时没有退出?
【发布时间】:2012-01-01 21:53:34
【问题描述】:

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

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

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

【问题讨论】:

标签: clojure


【解决方案1】:

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

调用shutdown-agents对于让JVM有序退出是必要的,因为代理线程池中的线程不是守护线程。

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

引用该答案:

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

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

【讨论】:

  • 很好的解决方案!我在多个项目中遇到了这个问题,我在其中运行其他命令,并添加 (shutdown-agents) 修复它。大概clojure.java.shell 正在使用某种其他线程来做它的事情。
【解决方案2】:

根据docs

...[pmap 仅对计算密集型函数有用,其中时间 的 f 支配了协调开销。

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

【讨论】:

  • 我不介意被否决,但请至少给出一个解释。
  • 感谢 Jason 的回答,但我怀疑 pmap 由于我添加到问题中的原因尚未完成其操作。您对这种行为还有其他想法吗?另外,仅供参考,我没有对你投反对票。
  • @wrongusername:没有其他建议。由于 Scott Lowe 提供的答案,看起来不需要。
猜你喜欢
  • 2019-10-03
  • 2014-07-19
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2015-03-06
  • 1970-01-01
相关资源
最近更新 更多