A Clojure library providing facilities for async programming and communication via channels and go blocks.
core.async is a Clojure library that provides facilities for asynchronous programming and communication using channels and go blocks. It implements a CSP (Communicating Sequential Processes) model, allowing developers to manage concurrency and asynchronous workflows in a declarative, sequential style. The library solves the problem of callback complexity in asynchronous code by offering a clean abstraction for coordinating independent processes.
Clojure and ClojureScript developers building applications that require concurrent processing, event-driven architectures, or complex asynchronous data flows. It's particularly valuable for those working on web servers, data pipelines, UI interactions, or any system where non-blocking operations are essential.
Developers choose core.async because it provides a unified, idiomatic way to handle concurrency in Clojure that avoids callback hell and integrates seamlessly with the language's functional programming model. Its channel abstraction offers a powerful yet simple primitive for coordinating asynchronous processes, and its cross-platform support ensures consistent behavior across JVM and JavaScript environments.
Facilities for async programming and communication in Clojure
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Seamlessly implements Communicating Sequential Processes with Clojure's functional style, enabling clean, sequential-looking asynchronous code via go blocks, as outlined in the rationale documentation.
Provides a uniform API for both Clojure (JVM) and ClojureScript (JavaScript), allowing code reuse and consistent behavior across environments, as noted in the key features.
Supports transducers for efficient data transformation and operations like alts! for non-deterministic selection, enhancing flexibility in complex async workflows, as detailed in the README.
Includes functions like pipeline and pipeline-blocking for building concurrent data processing workflows, simplifying producer-consumer patterns with backpressure.
Uses a MAJOR.MINOR.COMMITS scheme that doesn't follow semantic versioning, making it harder to predict breaking changes, as admitted in the releases section.
Pull requests and GitHub issues are not accepted; contributions require a signed agreement and must go through JIRA, which can slow community feedback and fixes.
The extensive changelog shows numerous bug fixes for exception handling in go blocks, indicating that error management can be tricky and prone to subtle issues.