Search code examples
clojuredelayfuture

clojure future vs delay


I have been reading through Programming in Clojure and found thing text

(defn get-document [id]
; ... do some work to retrieve the identified document's metadata ... {:url "http://www.mozilla.org/about/manifesto.en.html"
:title "The Mozilla Manifesto"
:mime "text/html"
:content (delay (slurp "http://www.mozilla.org/about/manifesto.en.html"))})

if callers are likely to always require that data, the change of replacing future over delay can prove to be a significant improvement in throughput.

I didn't get this part completely, can someone please explain a bit?


Solution

  • Simple answer future is background execution of body, delay is on-demand execution of body. Example: if you have list of 100 delay-ed code, and trying to loop through it - code will block while evaluating each list item (e.g. doing HTTP request) and first iteration will be slow. Same with future-d code - it'll evaluate all content in background thread(s) and results will be available instantly in your loop.

    Rule of thumb - if there is good chance that some or most of content will not be needed at all - use delay, otherwise use future.

    https://clojuredocs.org/clojure.core/delay https://clojuredocs.org/clojure.core/future