Clojure core.async和Lamina

5

core.async是Lamina的替代品吗?或者它有意成为Lamina的替代品吗?

如果不是,是否存在明确的情况,其中一种更优于另一种?


Clojure中的并发有许多不同的风味,可能会很有趣 - http://adambard.com/blog/clojure-concurrency-smorgasbord/ - edbond
我看到了那篇文章,虽然它很棒,但对于我的问题来说有点太“友好”了。 - shmish111
2个回答

14
我是Lamina的作者。 我认为core.async是一个制作得很好的库,其设计比Lamina更加清晰。 有一些事情我认为Lamina做得更好,主要与内省、性能和可扩展性有关。
我对core.async的主要问题是它除了流抽象之外,还带来了一个执行模型(所有内容都在core.async线程池上发生),这意味着如果你在任何地方使用它,它会限制代码库中其他所有内容的设计和实现。
我看到了许多将流作为core.async通道公开的“异步”库,这意味着只有在您熟悉core.async执行模型时才能使用这些库。
我即将发布一个名为Manifold的库,它尝试成为可以替代core.async、Lamina、Java阻塞队列等的“最小”流表示。 Manifold流可以被强制转换为core.async通道、Lamina通道等,任何这些东西都可以被强制转换回Manifold流。
我认为“异步”领域仍然很年轻,关于抽象的可扩展性、在生产环境中调试的易用性等方面还有许多未探索的问题。JVM提供了许多自省工具,但由于异步机制使用完全不同的执行模型,我们基本上需要从头开始。我不会告诉你使用Lamina而不是core.async,但我会提醒你core.async是一个应用级别的抽象,而不是一个库级别的抽象。

非常感谢您,从作者那里听到消息总是最好的。我没有意识到关于 core.async 的事情,这是一个值得考虑的好主意。我会阅读 Manifold 的理论文档,但现在已经是星期五晚上了 :) - shmish111
Manifold看起来不错,但我仍然需要在它背后做出选择。不过似乎Lamina和core.async可能会作为实现相同目标的不同策略而存在。我想我会更多地尝试Lamina,因为它已经在我们的代码库中了,但是core.async让我可以简单地将某些东西包装在一个go块中,并且看到了巨大的性能提升,而无需改变我思考那段代码的方式。 - shmish111
我现在看到Lamina已经被弃用了。目前我正在使用Manifold作为Kafka客户端,它似乎非常适合,因为我可以创建一个简单的库来返回流,人们可以根据自己的需要将其用作通道、序列、manifold流等等。很棒(假设它能正常工作 :))! - shmish111

3
core.asyncLamina是两个不同的项目,它们并不是为了取代彼此而存在。实际上,如果您想要,它们可以很好地协作。 Lamina是一种面向流的方法,而core.async是面向消息的。使用哪一个取决于您。在Lamina中,重要的是您为通道定义的回调函数,而在core.async中,通道和go块是解耦的,这使得其更灵活和模块化。

好的,我想核心异步创建者会认为它比Lamina更好,不是吗? - shmish111
@shmish111 我不知道,最好问问他们 :) 鉴于我的回答,我并不是说core.async比Lamina更好。 - Chiron
我说这话是因为我刚看完Rich Hickey关于core.async的演讲;) - shmish111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接