我什么时候应该使用Clojure的core.async
库,哪种类型的应用程序需要 async ?
Clojure提供4种基本的可变模型,如 refs ,代理,原子和线程本地/ vars 。这些可变引用是否无法以任何方式提供core.async
轻松提供的内容?
您能为异步编程提供真实世界的用例吗?
我如何理解当我发现问题并点击时,我说“这是我应该应用core.async的地方”?
我们也可以在 ClojureScript 中使用core.async
这是一个单线程平台,有什么好处(除了回调地狱)
答案 0 :(得分:7)
您可能希望阅读此内容:
core.async的最佳用例是ClojureScript,因为它允许您模拟多线程编程并避免 Callback Hell 。
在JVM Clojure中,core.async也可以方便地用于(轻量级)生产者 - 消费者体系结构。当然,你也可以随时use native Java queues。
答案 1 :(得分:4)
重要的是要指出,“async”这个词有两个共同的含义:#as;'在编程圈子里:
core.async
非常注重1(通过队列进行异步消息传递),并提供了一个用于实现绿色线程(go
宏)的宏。
根据我的经验,如果您只需要非阻止,我个人建议从Manifold开始,对您的用例做出较少的假设,然后使用core.async获取更高级的用例它不足的地方;请注意,两个库都能很好地互操作。
答案 2 :(得分:3)
我发现它对JVM上的副作用并行性的细粒度,可配置控制很有用。
e.g。如果以下内容执行Cassandra的读取,则返回async / chan:
(arche.async/execute connection :key {:values {:id "1"}})
然后,下面并行执行一系列执行,其中并行性是可配置的,并且结果按顺序返回。
(async/pipeline-async
n-parallelism
out
#(arche/execute connection :key {:values %1 :channel %2})
(async/to-chan [{:id "1"} {:id "2"} {:id "3"} ... ]))
可能对我的利基非常特别,但你明白了。
答案 3 :(得分:2)
Core.async为socket编程提供了构建块,这对于协调Clojure中的生产者/消费者交互非常有用。 Core.async的轻量级线程(go blocks)允许您从通道编写命令式样式代码,而不是在浏览器中使用回调。在JVM上,轻量级线程允许您利用完整的CPU线程。
您可以在此处查看完整堆栈CLJ / CLJS生产者/消费者Core.async聊天室的示例:https://github.com/briangorman/hablamos
core.async的另一个杀手级功能是管道功能。通常在数据处理中,您将使初始处理阶段占用大部分CPU时间,而后期阶段则需要占用大部分CPU时间。减少将显着减少。使用异步管道功能,您可以通过通道拆分处理以向管道添加并行化。 Core.async通道与传感器配合使用,因此通道现在可以与其他语言配合使用。