2014-12-22 28 views
1
(def queue-agent (agent (clojure.lang.PersistentQueue/EMPTY))) 
(send queue-agent conj "some data for the queue") 
(println "test output") 

如果我運行此代碼,幾秒鐘後控制檯將輸出test output然後什麼也沒有發生(程序沒有終止)。我剛剛檢查了幾個源代碼,都說send函數是異步的,應該立即返回到調用線程。那麼這有什麼問題?爲什麼它不回來?我有什麼問題嗎?或者與我的環境?Clojure代理的發送功能被阻止

+0

我運行的Clojure版本'1.5.1'順便說一句,如果有幫助。 – Peter

+0

你使用默認的'send'執行器嗎? (你有沒有叫'set-agent-send-executor!'來指定你自己的執行程序,可能有一個有界的隊列?) –

+0

是的,我只是使用默認的'send'執行程序,在這裏沒有改變任何東西。 – Peter

回答

3

所以你有兩個問題:啓動時間過長,程序不能退出。

啓動:Clojure不會做任何樹搖晃。當你運行一個Clojure程序時,你在每次運行時加載並引導編譯器,並初始化命名空間。幾秒鐘的時間聽起來正確的是一個裸露的骨骼Clojure程序。

掛起:如果您使用代理線程池,則必須運行shutdown-agents,如果您希望程序退出。虛擬機根本不知道將其關閉是安全的。

+0

你是對的啓動時間。我有這樣的感覺,直到產量比平時的啓動時間更長。但事實並非如此。我通過在開頭添加一個輸出來驗證它:輸出之間沒有延遲。 – Peter