我知道組件和系統(雖然還沒有使用它們),但我想知道如何初始化資源,當init方法可以從任何線程運行。假設我們有10個線程,並且它們都使用數據庫,線程可以按任意順序啓動。在這種情況下,我如何初始化數據庫連接池?什麼是正確的方式來初始化Clojure中的多線程程序中的資源
我目前使用比較和設置來做到這一點,但不知何故,它感覺不對。 這就是我所做的。我不知道什麼時候vm開始,當我的線程開始時(我正在使用風暴,db pool在一些螺栓中被初始化)。有一個更好的方法嗎?
我知道組件和系統(雖然還沒有使用它們),但我想知道如何初始化資源,當init方法可以從任何線程運行。假設我們有10個線程,並且它們都使用數據庫,線程可以按任意順序啓動。在這種情況下,我如何初始化數據庫連接池?什麼是正確的方式來初始化Clojure中的多線程程序中的資源
我目前使用比較和設置來做到這一點,但不知何故,它感覺不對。 這就是我所做的。我不知道什麼時候vm開始,當我的線程開始時(我正在使用風暴,db pool在一些螺栓中被初始化)。有一個更好的方法嗎?
您想使用locking
函數。它類似於Java中的。
請點擊這裏查看完整的文檔:http://clojuredocs.org/clojure.core/locking
你那麼代碼將類似於:
(def datasource (atom))
(locking datasource
(when (nil? @datasource))
(reset! datasource (make-datasource datasource-options))))
注意,你並不真正需要的原子內部的地圖。
看起來好多了。謝謝! – Ravi
你提到的組件和系統,你也可以看看[mount](https://github.com/tolitius/mount)以獲得更自然的clojure感覺。 – Shlomi
看起來很酷@Shlomi,會檢查出來 – Ravi