The first step toward fixing this issue—that is, to prevent a potentially long-running task from blocking our application—is to create new threads, which do the work and wait for it to complete. This way, we keep the application's main thread free to serve more clients.
Working directly with threads, however, is tedious and error-prone, so Clojure's core library includes futures, which are extremely simple to use:
(def f (clojure.core/future (println "doing some expensive work...") (Thread/sleep 5000) (println "done") 10)) (println "You'll see me before the future finishes") ;; doing some expensive work... ;; You'll see me before the future finishes ;; done
In the preceding snippet, we invoked the clojure.core/future macro with a body simulating an expensive...