在Clojure中管理资源池的最佳方法

Neo*_*mov 7 pool clojure

我有一个Web服务端点,它使用来自Java库的可变资源.该Web服务端点可以同时接收多个查询.(端点使用Ring/Compojure实现).创建这些资源成本很高,因此为每个Web服务调用重新创建它们实际上是低效的.

我想要做的是创建一个pool我在Web服务启动时填充的资源.然后,每次调用端点时,它都会从池中获取资源,将其用于处理,然后将其推回池中并等待下一次调用.

我想知道在Clojure中最好的方法是什么?是否有一个"池"Clojure库可以帮助我吗?

我天真地尝试使用原子中的向量来实现它,其中向量的每个项目都是该资源.然而,它很快就了解到它无法以这种方式真正发挥作用.

muh*_*huk 3

这是基于Timothy Pratley的使用 refs 的想法:

(def pool (ref ['a 'b 'c]))

(defn take' [pool]
  (dosync
    (let [[h & t] @pool]
      (ref-set pool (vec t))
      h)))

(defn put [pool x]
  (dosync
    (alter pool conj x)
    nil))

(take' pool)   ;; => 'a
(put pool 'a)  ;; => nil
(take' pool)   ;; => 'a
(take' pool)   ;; => 'b
(take' pool)   ;; => 'c
Run Code Online (Sandbox Code Playgroud)

也许不是解决这个问题的最佳方法。但我喜欢它的简单性。