Я использую 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))
Все признаки показывают, что это работает хорошо.
Это разумное решение? Меня беспокоит то, что кэширование промиса может привести к утечке ресурсов.
http/get
каждый раз возвращает другой промис и, таким образом, приводит к новому запросу. Я хочу кэшировать результатhttp/get
, т.е. хранить каждое результирующее обещание. - person Joe   schedule 28.07.2015