我有一个Web服务端点,它使用来自Java库的可变资源.该Web服务端点可以同时接收多个查询.(端点使用Ring/Compojure实现).创建这些资源成本很高,因此为每个Web服务调用重新创建它们实际上是低效的.
我想要做的是创建一个pool我在Web服务启动时填充的资源.然后,每次调用端点时,它都会从池中获取资源,将其用于处理,然后将其推回池中并等待下一次调用.
我想知道在Clojure中最好的方法是什么?是否有一个"池"Clojure库可以帮助我吗?
我天真地尝试使用原子中的向量来实现它,其中向量的每个项目都是该资源.然而,它很快就了解到它无法以这种方式真正发挥作用.
这是基于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)
也许不是解决这个问题的最佳方法。但我喜欢它的简单性。
| 归档时间: |
|
| 查看次数: |
507 次 |
| 最近记录: |