在这篇blog post中,作者写道:
然而,Grenchman建立在Jane Street的Core和Async库之上,Jane Street是OCaml最大的工业用户之一。 Async允许monadic虚并发,避免了其他事件驱动工具的许多回调问题,但它是相当单一的。
在J ane Street Documentation Page for Core Async上,他们将其描述为:
特别是,我们认为Async更好地控制程序的并发性,使得更容易推断可能的竞争条件。
我的问题是 - 在OCaml中core.async in Clojure和Core Async之间是否存在相似之处?我问,因为“避免回调头痛的'虚假并发'听起来与Clojure中core.async的应用非常相似。
答案 0 :(得分:8)
我无法发现主要的相似之处。 Clojure的core.async
的概念似乎主要基于Go的并发模型 - 许多名称是相同的,如通信通道,甚至用于异步执行代码的go
宏,如Go的关键字,语言本身的名称来源。
另一方面,Jane Street的Async概念在the introductory documentation的句子中进行了总结:
简而言之,我们的想法是使用非抢占式用户级线程 和带有阻塞的第一类阻塞操作 类型系统。
它使用特殊类型Deferred.t
来传达异步计算的结果,这些结果更类似于Clojure期货而非渠道。它还完全避开操作系统线程并使用用户线程代替,而core.async
确实使用操作系统线程(至少如果它们可用)。
编辑:经过一些进一步的调查后,两个库的重点在于提供了在不占用操作系统线程的情况下提供组合多个阻塞操作的方法。 Async还通过Deferred.t
模块提供(除了Pipe
)个频道。