回忆承诺是明智的吗?

时间:2015-07-28 13:32:00

标签: clojure promise core.async

我使用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))

所有迹象都表明这很有效。

这是一个明智的解决方案吗?我担心的是,缓存承诺可能会造成某种资源泄漏。

1 个答案:

答案 0 :(得分:0)

是的,记住一个承诺是明智的。事实上,在这种情况下,它可能是最明智的解决方案。毕竟,这就是http/get返回的内容,那就是你想要记忆的功能。

就资源泄漏而言,无论你是否记住承诺或其价值,这都不应该成为一个问题。承诺基本上只是一些在deliver!编辑后引用值的状态。所以你对这个参考有一点点开销,但与整个响应相比,它是微不足道的。