何时在Clojure中使用core.async?

时间:2018-03-18 20:35:26

标签: clojure core.async

我什么时候应该使用Clojure的core.async库,哪种类型的应用程序需要 async

Clojure提供4种基本的可变模型,如 refs 代理原子线程本地/ vars 。这些可变引用是否无法以任何方式提供core.async轻松提供的内容?

您能为异步编程提供真实世界的用例吗?

我如何理解当我发现问题并点击时,我说“这是我应该应用core.async的地方”

我们也可以在 ClojureScript 中使用core.async这是一个单线程平台,有什么好处(除了回调地狱)

4 个答案:

答案 0 :(得分:7)

您可能希望阅读此内容:

core.async的最佳用例是ClojureScript,因为它允许您模拟多线程编程并避免 Callback Hell

在JVM Clojure中,core.async也可以方便地用于(轻量级)生产者 - 消费者体系结构。当然,你也可以随时use native Java queues

答案 1 :(得分:4)

重要的是要指出,“async”这个词有两个共同的含义:#as;'在编程圈子里:

  1. 异步消息传递:组件发送消息而不期待消费者响应的系统,通常甚至不知道消费者是谁(通过队列)
  2. 非阻塞(又称事件驱动)I / O:以这样的方式构建的程序,它们不会阻止昂贵的计算资源(线程,核心......)等待回应。有几种具有不同抽象级别的approches,用于处理这样的系统:基于回调的API (低级,难以管理,因为基于副作用),承诺/期货/ Deferreds (我们尚未拥有的值的表示,因为它们是基于价值的,因此更易于管理),绿色线程('逻辑'线程,模仿普通的控制流程,但价格便宜)
  3. 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通道与传感器配合使用,因此通道现在可以与其他语言配合使用。