我使用HTTP Kit发出请求,我希望它们是异步的,但我也想缓存响应。我希望请求是异步的原因是我同时制作了几个,我希望它们并行运行。
这是我的函数并行发出多个请求。
(defn parallel-requests-1 [urls]
(let [; Dispatch all requests to run concurrently.
responses (doall (map #(http/get %) urls))
; Realise all promises.
realised (doall (map deref responses))
; Extract response body.
bodies (map :body realised)]
bodies))
(parallel-requests-1 ["http://example.com", "http://example.net"])
这纯粹是为了说明目的,以证明我不想仅仅deref
承诺并记住它。
现在我想使用memoize
添加缓存。我试过这个:
(def memoized-get (memoize http/get))
(defn parallel-requests-2 [urls]
(let [; Dispatch all requests to run concurrently.
responses (doall (map #(memoized-get %) urls))
; Realise all promises.
realised (doall (map deref responses))
; Extract response body.
bodies (map :body realised)]
bodies))
所有迹象都表明这很有效。
这是一个明智的解决方案吗?我担心的是,缓存承诺可能会造成某种资源泄漏。
答案 0 :(得分:0)
是的,记住一个承诺是明智的。事实上,在这种情况下,它可能是最明智的解决方案。毕竟,这就是http/get
返回的内容,那就是你想要记忆的功能。
就资源泄漏而言,无论你是否记住承诺或其价值,这都不应该成为一个问题。承诺基本上只是一些在deliver!
编辑后引用值的状态。所以你对这个参考有一点点开销,但与整个响应相比,它是微不足道的。