title: When to use core.async in Clojure?
body: <p>When should I use Clojure's <code>core.async</code> library, what kind of applications need that kinda <em>async</em> thing? </p>
  
  <p>Clojure provides 4 basic mutable models like <strong>refs</strong>, <strong>agents</strong>, <strong>atoms</strong> and <strong>thread locals/vars</strong>. Can't these mutable references provide in any way what <code>core.async</code> provides with ease?</p>
  
  <p>Could you provide real world use cases for <em>async programming</em>? </p>
  
  <p>How can I gain an understanding of it so that when I see a problem, it clicks and I say <em>"This is the place I should apply core.async"</em>?</p>
  
  <p>Also we can use <code>core.async</code> in <em>ClojureScript</em> which is a single threaded environment, what are the advantages there (besides avoiding callback hell)?</p>