【问题标题】:Clojure core.async and LaminaClojure core.async 和 Lamina
【发布时间】:2014-11-07 12:12:39
【问题描述】:

core.async 是替代 Lamina 还是打算替代 Lamina?

如果没有,是否存在明显的情况,其中一种优于另一种?

【问题讨论】:

标签: clojure core.async lamina-clojure


【解决方案1】:

我是 Lamina 的作者。我认为 core.async 是一个制作精良的库,其设计比 Lamina 更清晰。有些事情我认为 Lamina 更擅长,主要与内省、性能和可扩展性有关。

我对 core.async 的最大问题是,除了流抽象之外,它还带来了一个执行模型(一切都发生在 core.async 线程池上),这意味着如果你在任何地方使用它,它都会受到限制代码库中其他所有内容的设计和实现。

我已经看到许多“异步”库将流公开为 core.async 通道,这意味着您只能在熟悉使用 core.async 执行模型的情况下使用这些库。

我即将发布一个库,它试图成为一个“最小”的流表示,可以用来代替 core.async、Lamina、Java 阻塞队列等,称为Manifold。可以将 Manifold 流强制转换为 core.async 通道、Lamina 通道等,并且可以将任何这些内容强制转换回 Manifold 流。

我认为“异步”领域还很年轻,还有很多未探索的问题。抽象的可扩展性如何,它们在生产中调试的难易程度等等。 JVM 提供了很多自省工具,但由于异步机制使用完全不同的执行模型,我们基本上是从头开始重新开始。我不会告诉您在 core.async 上使用 Lamina,但我会提醒您,core.async 是应用程序级别的抽象,而不是库级别的抽象。

【讨论】:

  • 非常感谢,总是最好听取作者的意见。我没有意识到 core.async 是一件好事。我将阅读 Manifold 的基本原理文档,但现在星期五有点晚了 :)
  • 歧管看起来不错,但我仍然需要在它背后做出选择。似乎 Lamina 和 core.async 可能都会作为不同的策略来实现相同的最终目标。我想我会更多地使用 Lamina,因为它已经在我们的代码库中,但是 core.async 确实允许我简单地将一些东西包装在一个 go 块中并看到性能大幅提升,而无需改变我对那部分的看法代码。
  • 我现在看到 Lamina 已被弃用。我目前正在将 Manifold 用于 Kafka 客户端,这似乎是一个完美的选择,因为我可以制作一个返回流的简单库,人们可以按照自己的喜好使用它,作为通道、序列、歧管流等。太好了(假设它有效:))!
【解决方案2】:

core.asyncLamina 是两个不同的项目,它们并不打算相互替代。实际上,如果您愿意的话,它们可以很好地配合使用。
Lamina 是面向流的方法,而 core.async 是面向消息的方法。

使用哪一个取决于您。在 Lamina 中,重要的是你为通道定义的回调,而在 core.async 中,通道和go 块是解耦的,这样更加灵活和模块化。

【讨论】:

  • 好的,所以我想 core.async 的创建者会认为它是比 Lamina 更好的做事方式,不是吗?
  • @shmish111 我不知道,最好问问他们 :) 鉴于我的回答,我并不是说 core.async 比 Lamina 更好
  • 我是这么说的,因为我刚刚看了 Rich Hickey 的关于 core.async 的演讲;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多