Clojure&#x27;s core.async has &quot;go routines&quot;, (this is more or less the same as in go), basically you can put and take messages on a channel. These operations will block the green thread, so you end up writing synchronous code. The idea is that synchronous, blocking code is easier to understand then async code. Since these are lightweight threads it will scale better than using real threads. I&#x27;m pretty sure it&#x27;s fine to have hundreds of thousands of go routines.<p>This abstraction sits on top of java&#x27;s real threads, so you can have several real threads doing the work and they can switch between the go routines once the go routine hits one of the blocking operations.<p>Or something like that... read this: <a href="http:&#x2F;&#x2F;clojure.com&#x2F;blog&#x2F;2013&#x2F;06&#x2F;28&#x2F;clojure-core-async-channels.html" rel="nofollow">http:&#x2F;&#x2F;clojure.com&#x2F;blog&#x2F;2013&#x2F;06&#x2F;28&#x2F;clojure-core-async-channe...</a>