何时在Clojure中使用core.async?

Ert*_*tin 6 clojure core.async

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

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

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

我怎么能理解当我看到问题并点击它然后我说"这是我应该应用core.async的地方"

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

Ala*_*son 8

你可能希望看到这个:

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

在JVM Clojure中,core.async也可以方便地用于(轻量级)生产者 - 消费者体系结构.当然,您也可以始终使用本机Java队列.

  • 来自在 ClojureScript 中从事一个相当大的项目的人的评论:不要去那里。语义不同,可能会破坏 JS 运行时。更喜欢 Promise 或其他机制 - 使用 Promise 代替 Promise 可能会向顶层“冒泡”异常并破坏运行时;使用回调而不是回调可能会导致“挂起的放置数量达到最大!” 错误... (3认同)

Val*_*nck 5

它指出,有在编程界相关联的单词“异步” 2层普通的意思是非常重要的:

  1. 异步消息:系统中的组件发送消息,不要指望从他们的消费者的响应,往往甚至不知道消费者是谁(通过队列)
  2. 非阻塞(又称为事件驱动)I / O:以这样的方式构造的程序:它们在等待响应时不会阻塞昂贵的计算资源(线程,内核等)。处理此类系统有几种方法,具有不同的抽象级别:基于回调的API(低级别,由于副作用而难以管理),承诺/未来/递延(我们不做的值的表示)还没有,因为它们是基于值的,所以更易于管理),绿色线程(“逻辑”线程模仿普通的控制流,但是价格便宜)

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

根据我的经验,如果您只需要无阻塞,我个人建议从Manifold开始,它对您的用例进行较少的假设,然后将core.async用于无法使用的更高级的用例。注意,这两个库很好地互操作。