何时在Clojure中使用core.async?
什么时候应该使用Clojure的何时在Clojure中使用core.async?,clojure,core.async,Clojure,Core.async,什么时候应该使用Clojure的core.async库,什么样的应用程序需要这种异步功能 Clojure提供了4种基本的可变模型,如参考值、代理、原子和线程局部变量/变量。这些可变引用不能以任何方式提供core.async轻松提供的功能吗 您能为异步编程提供真实世界的用例吗 我如何理解它,当我看到一个问题时,它会点击,我说“这是我应该应用core.async的地方” 此外,我们还可以在ClojureScript中使用core.async,ClojureScript是一个单线程环境,除了避免回调地
core.async
库,什么样的应用程序需要这种异步功能
Clojure提供了4种基本的可变模型,如参考值、代理、原子和线程局部变量/变量。这些可变引用不能以任何方式提供core.async
轻松提供的功能吗
您能为异步编程提供真实世界的用例吗
我如何理解它,当我看到一个问题时,它会点击,我说“这是我应该应用core.async的地方”
此外,我们还可以在ClojureScript中使用
core.async
,ClojureScript是一个单线程环境,除了避免回调地狱外,还有哪些优点?您可能希望阅读以下内容:
- Rich Hickey的介绍性博客
- 勇敢地进入
在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的另一个致命特性是管道特性。通常,在数据处理过程中,初始处理阶段会占用大部分CPU时间,而后期阶段(如减少)占用的CPU时间会明显减少。使用异步管道特性,您可以通过通道分割处理,以将并行化添加到管道中。Core.async通道与传感器配合使用,因此通道现在与语言的其他部分配合得很好。需要指出的是,在编程界,“async”一词有两种常见含义:
core.async
非常支持1(通过队列的异步消息传递),并提供了一个用于实现绿色线程的宏(“code>go宏”)
根据我的经验,如果您只需要非阻塞,我个人建议您从开始,这会减少对您的用例的假设,然后将其用于更高级的用例中,如果它不足的话;请注意,这两个库的互操作性都很好。别忘了,您还可以使用
未来
或承诺
。ClojureScript中某个在相当大的项目中工作的人的评论:不要去那里。语义是不同的,它可以破坏JS运行时。更喜欢承诺或其他机制-使用而不是承诺可以“冒泡”顶级异常并破坏运行时;使用instead而不是回调会导致“最大挂起put数!”错误。。。