我知道组件和系统(虽然还没有使用它们),但我想知道如何初始化资源,当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