何时在Clojure中使用core.async?

何时在Clojure中使用core.async?,clojure,core.async,Clojure,Core.async,什么时候应该使用Clojure的core.async库,什么样的应用程序需要这种异步功能 Clojure提供了4种基本的可变模型,如参考值、代理、原子和线程局部变量/变量。这些可变引用不能以任何方式提供core.async轻松提供的功能吗 您能为异步编程提供真实世界的用例吗 我如何理解它,当我看到一个问题时,它会点击,我说“这是我应该应用core.async的地方” 此外,我们还可以在ClojureScript中使用core.async,ClojureScript是一个单线程环境,除了避免回调地

什么时候应该使用Clojure的
core.async
库,什么样的应用程序需要这种异步功能

Clojure提供了4种基本的可变模型,如参考值代理原子线程局部变量/变量。这些可变引用不能以任何方式提供
core.async
轻松提供的功能吗

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

我如何理解它,当我看到一个问题时,它会点击,我说“这是我应该应用core.async的地方”


此外,我们还可以在ClojureScript中使用
core.async
,ClojureScript是一个单线程环境,除了避免回调地狱外,还有哪些优点?

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

  • Rich Hickey的介绍性博客
  • 勇敢地进入
core.async的最佳用例是ClojureScript,因为它允许您模拟多线程编程并避免回调地狱


在JVM Clojure中,core.async还可以方便地用于需要(轻量级)生产者-消费者体系结构的地方。当然,您也可以这样做。

我发现它对于JVM上副作用并行性的细粒度、可配置控制非常有用

e、 g.如果以下操作执行从Cassandra读取,则返回异步/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"} ... ]))
可能对我的利基很特别,但你明白了


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

您可以在此处看到完整堆栈CLJ/CLJS producer/consumer Core.async聊天室的示例:


core.async的另一个致命特性是管道特性。通常,在数据处理过程中,初始处理阶段会占用大部分CPU时间,而后期阶段(如减少)占用的CPU时间会明显减少。使用异步管道特性,您可以通过通道分割处理,以将并行化添加到管道中。Core.async通道与传感器配合使用,因此通道现在与语言的其他部分配合得很好。

需要指出的是,在编程界,“async”一词有两种常见含义:

  • 异步消息传递:组件发送消息而不需要消费者响应的系统,通常甚至不知道消费者是谁(通过队列)
  • 非阻塞(又称事件驱动)I/O:程序的结构应确保在等待响应时不会阻塞昂贵的计算资源(线程、内核等)。有几种不同抽象级别的方法可用于处理此类系统:基于回调的API(低级别,难以管理,因为基于副作用),承诺/未来/延期(我们还没有的价值表示,因为它们是基于价值的,所以更易于管理),绿色线程(“逻辑”线程,模拟普通控制流,但价格低廉)
  • core.async
    非常支持1(通过队列的异步消息传递),并提供了一个用于实现绿色线程的宏(“code>go宏”)


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

    别忘了,您还可以使用
    未来
    承诺
    。ClojureScript中某个在相当大的项目中工作的人的评论:不要去那里。语义是不同的,它可以破坏JS运行时。更喜欢承诺或其他机制-使用而不是承诺可以“冒泡”顶级异常并破坏运行时;使用instead而不是回调会导致“最大挂起put数!”错误。。。