2012-01-01 70 views
14

什麼會導致Clojure程序不能在完成主函數中的最後一條語句時立即退出?完成上次陳述後,Clojure程序不會退出嗎?

我所做的只是將(doall (map ...))更改爲(doall (pmap ...)),並且在退出之前,程序在完成其任務後突然停止好幾秒鐘。我把一個(println "Finished everything!")-main函數的最後一行,它會打印,但仍然有一段時間不會退出。什麼可能導致這種行爲,我應該如何解決?

編輯:PMAP是並行程序的唯一部分(主要是因爲一切運行或多或少瞬間)。由於程序的後面部分需要pmap的所有結果才能正確運行,並且由於map和pmap的程序輸出是相同的,所以我有些懷疑pmap仍然會在程序結束時運行。將(System/exit 0)放在末尾而不是println也不會更改程序輸出。

+1

我猜PMAP不能完全做到做它的處理時,它的代碼觸發之後。很難說沒有更多的代碼顯示。的 – 2012-01-01 22:04:20

+1

可能重複[已執行我的計算後,爲什麼Clojure的掛?](http://stackoverflow.com/questions/2622750/why-does-clojure-hang-after-having-performed-my-calculations) – amalloy 2012-01-01 22:31:11

回答

15

pmap將從一個線程池旋轉起來多線程服務您的併發任務。

調用shutdown-劑是必要的,讓JVM能夠有序地退出,因爲在代理的線程池的線程不是守護線程。

你需要明確地告訴他們正常關閉(但只有當你的程序完成)。這看起來已經在here之前得到了回答。

從這個問題的答案引用:

「你需要調用shutdown-agents殺死線程支持通過PMAP使用線程池」

文檔是在這裏:http://clojuredocs.org/clojure_core/1.3.0/clojure.core/shutdown-agents

+0

偉大的解決方案!我在多個項目中遇到了這個問題,我在其中運行其他命令,並添加'(shutdown-agents)'修復它。據推測'clojure.java.shell'正在使用某種其他線程來完成它的工作。 – 2016-10-14 19:30:10

4

按照docs

... [PMAP是O]爲其中f的時間 占主導地位的協調開銷計算密集型功能的唯一一句有用的。

因此,這可能意味着存在使用pmap您的方案比使用map更多的開銷。 pmap操作可能需要一些額外的時間才能在pmap觸發之後完成代碼。

+0

我不不介意被低估,但請至少給出解釋。 – 2012-01-01 22:10:50

+0

謝謝你的回答傑森,但我懷疑pmap還沒有完成其操作,因爲我添加到問題的原因。你會對這種行爲有任何其他想法嗎?另外,就我而言,我並沒有讓你失望。 – wrongusername 2012-01-01 22:16:47

+0

@wrongusername:沒有其他建議。由於Scott Lowe提供的答案,不需要它的外觀。 – 2012-01-01 22:44:25