可以在Clojure中使用ClojureScript的core.async实现吗?

时间:2014-02-12 10:56:37

标签: clojure clojurescript core.async

是否可以在Clojure中使用ClojureScript基于状态机的core.async实现,而不是Clojure基于线程的实现?我希望能够在JVM上使用core.async但不使用线程。

2 个答案:

答案 0 :(得分:7)

没有办法以严格的单线程方式在JVM上使用core.async,除非您愿意进入内部并将go s用于的线程池替换为仅使用的线程池单线程。

然而,正如edbond在他的评论中指出的那样,Core.async的Clojure版本确实使用状态机来处理go。然后,这些状态机在线程池的线程上运行,线程池的大小限制为处理器数量的两倍+ 42,因此可以在不使用尽可能多的真实线程的情况下启动数千个go

JVM core.async还提供了thread宏,其工作方式与go类似,但启动了实际线程,以及一系列双重操作(<!!,{{1}它们就像他们的单声道同行一样,但是以阻挡的方式。你是否使用它们取决于你;如果您坚持使用>!!和单一操作系列,则core.async将永远不会启动超出上述线程池限制的任何线程。

答案 1 :(得分:3)

目前还不可能,但没有什么可以阻止您修改core.async以支持单线程模型。所有调度都是通过clojure.core.async.impl.dispatch/run来处理的。更改该函数以使用某种其他调度方法,事情应该正常工作。 Core.async的ClojureScript版本具有不同版本的dispatch/run,它使用setTimeout(或其他可能更快的东西)。复制该代码,并将其修改为适用于您的VM,它不应该是一个很难改变。