首页 文章

何时在Clojure中使用core.async?

提问于
浏览
3

我什么时候应该使用Clojure的 core.async 库,什么样的应用程序需要那种异步的东西?

Clojure提供了4个基本的可变模型,如 refsagentsatomsthread locals/vars . 这些可变引用是否无法以任何方式提供 core.async 轻松提供的内容?

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

我怎么能理解当我看到问题并点击它然后我说"This is the place I should apply core.async"?

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

4 回答

  • 3

    重要的是要指出编程圈中“异步”这个词有两个共同含义:

    • asynchronous messaging: 组件发送消息而不期待消费者响应的系统,通常甚至不知道消费者是谁(通过队列)

    • non-blocking (a.k.a event-driven) I/O: 程序的结构使得它们在等待响应时不会阻塞昂贵的计算资源(线程,核心......) . 有几个具有不同抽象级别的approches,用于处理这样的系统: callback-based APIs (低级,难以管理,因为基于副作用), Promise/Futures/Deferreds (我们还没有的值的表示,更易于管理)它们是基于 Value 的), Green Threads ('logical'线程模仿普通的控制流程,但价格便宜)

    core.async 非常注重1(通过队列进行异步消息传递),并提供了一个用于实现绿色线程( go 宏)的宏 .

    根据我的经验,如果你只需要非阻塞,我个人建议从Manifold开始,这对你的用例做出较少的假设,然后使用core.async用于不足的高级用例;请注意,两个库都能很好地互操作 .

  • 6

    你可能希望看到这个:

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

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

  • 3

    我发现它对JVM上的副作用并行性的细粒度,可配置控制很有用 .

    例如如果以下执行从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"} ... ]))
    

    可能对我的利基非常特别,但你明白了 .

  • 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通道可以与传感器配合使用,因此通道可以很好地与其他语言配合使用 .

相关问题