HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
clojure
core.async
Clojure2013–2025
clojure / core.async

core.async

Facilities for async programming and communication in Clojure

42Distinct people
49Mentions
1Explicit recommenders
2.1KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Facilities for async programming and communication in Clojure

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Actually that's the one thing that's driven me away from Clojure. I love the simplicity behind the language and it makes simple things actually simple - which isn't as trivial…

moonchrome used a recommendation phrase. One indexed comment matches. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 6:01:08 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year49 dated mentions

Observed mentions: 2013-06-28 21:40:31 UTC to 2025-02-23 21:58:48 UTC.

0510152013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 16 mentions; 3 submissions, 13 comments20132014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 8 mentions; 0 submissions, 8 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 7 mentions; 0 submissions, 7 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments20192020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 4 mentions; 2 submissions, 2 comments2025

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC16313
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC808
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC707
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC202
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC202
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC202
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC101
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC202
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC303
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC101
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC000
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC101
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC422

From the project README

An excerpt from the repository, fetched Nov 12, 2026.

Read the project’s introduction
core.async A Clojure library providing facilities for async programming and communication. Documentation Rationale API docs Code walkthrough Presentations Rich Hickey on core.async Tim Baldridge on core.async from Clojure/conj 2013 (code). Tim Baldridge on go macro internals - part 1 part 2 Releases and Dependency Information This project follows the version scheme MAJOR.MINOR.COMMITS where MAJOR and MINOR provide some relative indication of the size of the change, but do not follow semantic versioning. In general, all changes endeavor to be non-breaking (by moving to new names rather than by breaking existing names). COMMITS is an ever-increasing counter of commits since the beginning of this repository. Latest release: 1.9.865 All Released Versions deps.edn dependency information: org.clojure/core.async {:mvn/version "1.9.865"} Leiningen dependency information: [org.clojure/core.async "1.9.865"] Maven dependency information: <dependency> <groupId>org.clojure</groupId> <artifactId>core.async</artifactId> <version>1.9.865</version> </dependency> Contributing Contributing to Clojure projects requires a signed Contributor Agreement. Pull requests and GitHub issues are not accepted; please use the core.async JIRA project to report problems or enhancements. To run the ClojureScript tests: lein cljsbuild once open script/runtests.html View JavaScript console for test results License Distributed under the Eclipse Public License, the same as Clojure. Copyright © Rich Hickey and contributors Changelog Release 1.10.870-alpha2 on 2026-04-06 ASYNC-275 (CLJ) Fixed flow/futurize to retain original behavior of propagating exceptions Release 1.10.864-alpha1 on 2026-03-19 Alpha release of core.async.flow - all APIs subject to change ASYNC-274 (CLJ) Fixed flow/futurize stopped returning a future on Executor change ASYNC-270 (CLJ) futurize with no :exec arg throws Release 1.9.865 on 2026-03-19 (accumulated changes since 1.8.741) Added datafy support for channels and buffers ASYNC-273 (CLJ) alts!! callbacks should dispatch on caller when possible ASYNC-272 (CLJ) Use JVM virtual threads in io-thread ASYNC-269 (CLJ) Noop callbacks dispatch on caller thread Release 1.9.859-alpha4 on 2026-03-16 ASYNC-273 (CLJ) alts!! callbacks should dispatch on caller when possible ASYNC-274 (CLJ) Fixed flow/futurize stopped returning a future on Executor change ASYNC-270 (CLJ) futurize with no :exec arg throws Release 1.9.847-alpha3 on 2026-03-11 Flow - first cut of broadcast system ASYNC-262 (CLJ) REVERTED from 1.9.829-alpha2 ASYNC-272 (CLJ) Use JVM virtual threads in io-thread ASYNC-269 (CLJ) Noop callbacks dispatch on caller thread Release 1.9.829-alpha2 on 2025-10-01 ASYNC-262 (CLJ) Use virtual threads when available for go and io-thread Release 1.9.808-alpha1 on 2025-04-28 First alpha release of core.async.flow - all APIs subject to change Added datafy support for channels and buffers Release 1.8.741 on 2025-04-07 ASYNC-234 (CLJ) Inactive alt handlers hold strong references to (potentially large) caller state after the alt completes Release 1.8.735 on 2025.04.02 Fix reflection warnings when using clojure.core.async.go-checking Release 1.8.730 on 2025.04.02, effective changes since last non-beta release: ASYNC-256 (CLJ) Add io-thread and System property clojure.core.async.executor-factory ASYNC-260 (CLJ) Remove now unused property clojure.core.async.pool-size ASYNC-255 (CLJ) alts guards against put of nil message on entry Release 1.8.726-beta3 on 2025.03.31 ASYNC-259 (CLJ) Update clojure.core.async.go-checking with new executor pools Release 1.8.718-beta2 on 2025.03.10 ASYNC-259 (CLJ) Implement clojure.core.async.go-checking with new executor pools ASYNC-260 (CLJ) Remove now unused property clojure.core.async.pool-size ASYNC-261 (CLJ) Put clojure.core.async/thread-macro-executor var back into place Release 1.8.711-beta1 on 2025.02.19 ASYNC-256 (CLJ) Add io-thread and System property clojure.core.async.executor-factory ASYNC-255 (CLJ) alts guards against put of nil message on entry Update tools.analyzer.jvm to 1.3.2 Release 1.7.701 on 2024.12.17 ASYNC-254 (CLJ) Completions for blocking ops can be directly delivered without enqueuing for dispatch ASYNC-252 (CLJ) Move go expander from ioc-macros to impl.go namespace ASYNC-246 (CLJ) Fix non-deterministic test Update deps to latest Release 1.6.681 on 2023.08.09 Revert ASYNC-248 (CLJ) due to the issues in ASYNC-249 Update to tools.analyzer.jvm 1.2.3 Release 1.6.673 on 2022.10.27 ASYNC-248 (CLJ) Dynamically load ioc analyzer only when needed Perf improvements in go macro compilation Note: as of this version, core.async requires Clojure 1.10 Release 1.5.648 on 2021.12.14 Update dep for tools.analyzer.jvm to 1.2.2 Release 1.5.644 on 2021.12.06 Update dep for tools.analyzer.jvm to 1.2.1 Release 1.5.640 on 2021.11.23 ASYNC-204 (both) On put to closed channel, commit handler to allow pending alt ops to be cleaned up ASYNC-235 (both) Fix ioc-macros/return-chan registers a callback with incorrect arity ASYNC-144 (both) Tweak docstring in pipeline-async ASYNC-238 (both) Fix a/map with empty chan vector hangs Release 1.4.627 on 2021.11.03 ASYNC-132 (CLJS) Can't close over locals in #js in go) ASYNC-117 (CLJS) let-bindings unavailable in #js literals in go-blocks Update dep for tools.analyzer.jvm to 1.2.0 Release 1.3.618 on 2021.04.26 ASYNC-237 (CLJS) timeout timers access array elements with out-of-bounds index Release 1.3.610 on 2020.07.24 Update dep for tools.analyzer.jvm to 1.1.0 Release 1.2.603 on 2020.05.11 Fix bug in cljs impl of onto-chan! in 1.2.598 Release 1.2.598 on 2020.05.11 Add onto-chan! and to-chan! to cljs core.async Release 1.2.593 on 2020.05.11 onto-chan use of go-loop incompatible with blocking colls, replace with onto-chan! and onto-chan!! Release 1.1.587 on 2020.04.01 Added :require-macros for the promise interop from 1.1.582 Release 1.1.582 on 2020.03.31 Bumped deps -
Read the full README on GitHub

What Hacker News says

8 sources
moonchrome·Nov 12, 2014Recommendation phrase
Actually that's the one thing that's driven me away from Clojure. I love the simplicity behind the language and it makes simple things actually simple - which isn't as trivial as it sounds. But once you start dealing with complex things in Clojure the language doesn't do much for you, if you can't fit your problem in to it's provided toolkit the code written will actually be horrible - for example go look at core.async [1] implementation - just reading that code gives me a headache - I understand it's complicated stuff with buffering and all but having type annotations on protocols and variables used would be extremely helpful when trying to parse that code. Types help me think more abstractly when I'm reading the code as I can take them as compiler enforced contracts and think of them in abstract terms, in dynamically typed languages com
Read the rest
plexity and the amount of things you need to be aware of is just too overwhelming IMO. [1] https://github.com/clojure/core.async/blob/master/src/main/c...
In Microsoft takes .NET open source and cross-platform
core.async [1] is basically the canonical example of a Clojure library that relies on macros to do its job, although surprisingly few macros actually need to be exposed in the public API. Most notable is the go macro, which performs deep-walking code transformation on its body, permitting clients to write async code in a straightforward, boilerplate-free way. There's usually a heavy emphasis in the Clojure community on keeping macros as small as possible – the thinking is that any behavior that can be implemented with ordinary functions should be, and most macros should be lightweight wrappers over these functions. This seems to fit together well with what I've observed: functional programming idioms often circumvent some of the more common legacy uses of macros in practice, relegating macros to a still-essential but less prevalent role.
Read the rest
In Fear of Macros
JavaScript's (and so Node's) limited concurrency primitives and unfettered mutability have, in my experience, resulted in its making a number of concurrency-related problems harder to deal with, not easier. Mutability can be tamed with the help of libraries that provide immutable collections[1]. The best concurrency facility for JavaScript that I've found is core.async[2], but you can't really mimic it with vanilla JavaScript as the language doesn't provide macros. It might be interesting, though, to see if the core.async patterns could be implemented in terms of sweet.js[3] and with the help of esprima or acorn[4]. [1] mori, for example: http://swannodette.github.io/mori/ [2] https://github.com/clojure/core.async [3] http://sweetjs.org/ [4] http://esprima.org/ [&] http://marijnhaverbeke.nl/acorn/
In Node.js is Human
Node only runs on one core, you can start it more then once. This only works if the request well don't have to coordinate over the hole address space. You need to care all the shared state in a database, witch you don't really want to do. Go, is pretty good for that and it helps to think about it. You can start on thread of control per request, like with Scala where you might start one actor per request but the difference is that you have first class channels to communicate. Witch is pretty powerful. One the JVM you can do this CSP style where well with Clojure (https://github.com/clojure/core.async). Interesting video why CSP is best: > http://www.infoq.com/presentations/clojure-core-async
In Scala – 1 Star Would Not Program Again

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.