<story><title>Fearless Concurrency: Clojure, Rust, Pony, Erlang and Dart</title><url>https://sites.google.com/a/athaydes.com/renato-athaydes/posts/fearlessconcurrencyhowclojurerustponyerlanganddartletyouachievethat</url></story><parent_chain><item><author>tombert</author><text>I&amp;#x27;m a bit surprised that there didn&amp;#x27;t appear to be any mention of Clojure&amp;#x27;s built-in concurrency support outside of basic immutability.  core.async gives a nice channel-based system, agents give an actor-ish system, and STM&amp;#x2F;atoms let you mutate the variable safely, without having to manually work with locks.&lt;p&gt;This is definitely a good high-level article, just something I was surprised by, since core.async is what drove me (and several other people I know) to start using Clojure.&lt;p&gt;EDIT: Just a note that I know core.async isn&amp;#x27;t built in, that was a mistake.  It &lt;i&gt;is&lt;/i&gt; a first-party library, however.</text></item></parent_chain><comment><author>jwr</author><text>Yes, core.async should definitely be mentioned. It&amp;#x27;s also much more than a nice channel-based system, but you have to dive in to appreciate how good it is. For example, you have to write real systems to appreciate the fact that core.async channels can be used both from &amp;quot;go-threads&amp;quot; and real threads. That&amp;#x27;s really useful when your async work involves both quickly sending responses to clients (where lightweight go-threads shine) and doing heavy I&amp;#x2F;O for database updates (where you want a thread to pick up the work). You use the same channels for all types of work, which is really neat.</text></comment>
<story><title>Fearless Concurrency: Clojure, Rust, Pony, Erlang and Dart</title><url>https://sites.google.com/a/athaydes.com/renato-athaydes/posts/fearlessconcurrencyhowclojurerustponyerlanganddartletyouachievethat</url></story><parent_chain><item><author>tombert</author><text>I&amp;#x27;m a bit surprised that there didn&amp;#x27;t appear to be any mention of Clojure&amp;#x27;s built-in concurrency support outside of basic immutability.  core.async gives a nice channel-based system, agents give an actor-ish system, and STM&amp;#x2F;atoms let you mutate the variable safely, without having to manually work with locks.&lt;p&gt;This is definitely a good high-level article, just something I was surprised by, since core.async is what drove me (and several other people I know) to start using Clojure.&lt;p&gt;EDIT: Just a note that I know core.async isn&amp;#x27;t built in, that was a mistake.  It &lt;i&gt;is&lt;/i&gt; a first-party library, however.</text></item></parent_chain><comment><author>stingraycharles</author><text>It’s also worth noting that almost nobody uses agents or STM (except for some highly specific use cases, but I’ve never seen them in years), and core.async is a library, not a part of Clojure (which is a good thing, because it promotes choice and keeps the language small).</text></comment>