【问题标题】:When to use core.async in Clojure?何时在 Clojure 中使用 core.async?
【发布时间】:2018-08-27 09:34:34
【问题描述】:

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

Clojure 提供了 4 种基本的可变模型,例如 refsagentsatomsthread locals/vars。这些可变引用不能以任何方式提供core.async 轻松提供的功能吗?

您能否提供异步编程的真实用例?

我怎样才能理解它,以便当我看到问题时,它会点击并说“这是我应该应用 core.async 的地方”

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

【问题讨论】:

  • 别忘了您也可以使用futurepromise

标签: clojure core.async


【解决方案1】:

您可能希望阅读以下内容:

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

在 JVM Clojure 中,core.async 也可以在您需要(轻量级)生产者-消费者架构的地方方便地使用。当然,您也可以随时 use native Java queues 这样做。

【讨论】:

  • 一个在 ClojureScript 中从事一个相当大的项目的人的评论:不要去那里。语义不同,它会破坏 JS 运行时。首选 Promise 或其他机制 - 使用而不是 Promise 可以将异常“冒泡”到顶层并破坏运行时;使用而不是回调可能会导致“最大挂起数量!”错误...
【解决方案2】:

需要指出的是,在编程圈中,“异步”这个词有两种常见的含义:

  1. 异步消息传递: 组件发送消息而不期望其消费者响应的系统,并且通常甚至不知道消费者是谁(通过队列)
  2. 非阻塞(也称为事件驱动)I/O:程序的结构使得它们在等待响应时不会阻塞昂贵的计算资源(线程、内核等)。处理此类系统有多种抽象级别不同的方法:基于回调的 API(低级,由于基于副作用而难以管理)、Promise/Futures /Deferreds(我们还没有的值的表示,因为它们是基于值的,所以更易于管理),Green Threads(模拟普通控制流的“逻辑”线程,但便宜)

core.async 对 1(通过队列的异步消息传递)非常固执己见,并提供了一个用于实现绿色线程的宏(go 宏)。

根据我的经验,如果您只需要非阻塞,我个人建议从 Manifold 开始,这样可以减少对您的用例的假设,然后将 core.async 用于它不足的更高级用例;请注意,这两个库的互操作性很好。

【讨论】:

    【解决方案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"} ... ]))
    

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

    【讨论】:

      【解决方案4】:

      Core.async 为类套接字编程提供构建块,这对于协调 Clojure 中的生产者/消费者交互很有用。 Core.async 的轻量级线程(go 块)让您可以编写从通道读取的命令式代码,而不是在浏览器中使用回调。在 JVM 上,轻量级线程可让您充分利用 CPU 线程。

      您可以在此处查看全栈 CLJ/CLJS 生产者/消费者 Core.async 聊天室的示例:https://github.com/briangorman/hablamos

      core.async 的另一个杀手级特性是管道特性。通常在数据处理中,初始处理阶段会占用大部分 CPU 时间,而后期阶段,例如减少将占用显着减少。使用异步管道功能,您可以通过通道拆分处理以将并行化添加到您的管道。 Core.async 通道与传感器一起使用,因此通道现在可以很好地与语言的其余部分配合使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多