Clojure的core.async和Jane Street的OCaml Core Async类似吗?

8
在这篇博客文章中,作者写道:

然而,Grenchman是建立在Jane Street的Core和Async库之上的,Jane Street是OCaml最大的产业用户之一。Async允许使用单子伪并发,避免了其他事件驱动工具中的大量回调困扰,但它相当庞大。

在Jane Street的Core Async文档页面上,他们将其描述为:

特别地,我们认为Async能更好地控制程序的并发性,使得推断可能存在的竞态条件变得更容易。

我的问题是- Clojure中的core.async和OCaml中的Core Async之间是否有相似之处?我问这个问题是因为“伪并发以避免回调困扰”听起来与在Clojure中应用core.async非常相似。
1个回答

8
我无法发现重大的相似之处。Clojure的core.async概念似乎主要基于Go的并发模型——很多名称都相同,例如用于通信的通道,甚至是go宏用于异步执行代码,就像Go语言中命名语言本身的关键字一样。
另一方面,Jane Street的Async概念可以在介绍文档中的这句话中总结:
“简而言之,使用非抢占式用户级线程和一等阻塞操作,并在类型系统中表达阻塞。”
它使用特殊类型的Deferred.t来传递异步计算的结果,这更类似于Clojure futures而不是通道。它还完全避免使用操作系统(OS)线程,而是使用用户线程,而core.async则利用操作系统线程(至少如果有可用的话)。 编辑:经过进一步调查,有一个明显的相似之处,即两个库都专注于提供将多个阻塞操作组合在一起而不绑定操作系统(OS)线程的方法。除了Deferred.t,Async还通过Pipe模块提供了通道。

如果我是新手,你推荐哪一个? - BlueTrin
1
@BlueTrin:由于一个是OCaml库,另一个是Clojure库,我建议根据你更熟悉/需要的其他功能或库(除了并发支持)来选择。对于好的高级并发库,这两个都可以胜任,尽管Clojure特别支持标准库中的其他并发模型。 - Rörd

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