What if you don't care about the result of some operation? You just need to fire something and then forget it. In that case agents are what you need.
Agents also run in separate thread pools, there are two functions that you can use to fire an agent:
send
: This executes your function in an implicit thread poolsend-off
: This tries to execute your function in a new thread but there's a change, it will reuse another thread
Agents are the way to go if you want to cause side effects in a transaction; since, they will only be executed after the transaction has completed successfully.
They work in a very simple manner, here is an example usage:
(def agt (agent 0)) (defn sum [& nums] (Thread/sleep 5000) (println :done) (apply + nums)) (send agt sum 10) ;; You can replace send with send-off ;; if you want this to be executed in a different thread @agt
If you copy and paste the exact previous code you will see a 0
and then a :done
message, if you check for the value...