Can ClojureScript';是否在Clojure中使用core.async的实现?
是否可以在Clojure中使用ClojureScript基于状态机的core.async实现,而不是Clojure基于线程的实现?我希望能够在JVM上使用core.async,但不使用线程。在JVM上无法以严格的单线程方式使用core.async,除非您愿意深入到内部并将用于Can ClojureScript';是否在Clojure中使用core.async的实现?,clojure,clojurescript,core.async,Clojure,Clojurescript,Core.async,是否可以在Clojure中使用ClojureScript基于状态机的core.async实现,而不是Clojure基于线程的实现?我希望能够在JVM上使用core.async,但不使用线程。在JVM上无法以严格的单线程方式使用core.async,除非您愿意深入到内部并将用于gos的线程池替换为只使用单线程的线程池 然而,正如edbond在评论中指出的那样,core.async的Clojure版本确实使用状态机来处理gos。然后,这些状态机在线程池中的线程上运行,该线程池的大小限制为处理器数+4
go
s的线程池替换为只使用单线程的线程池
然而,正如edbond在评论中指出的那样,core.async的Clojure版本确实使用状态机来处理go
s。然后,这些状态机在线程池中的线程上运行,该线程池的大小限制为处理器数+42的两倍,因此可以启动数千个go
s,而不使用那么多的实际线程
JVM core.async还提供了一个
线程
宏,该宏的工作方式类似于go
,但会启动真正的线程,另外还提供了一组双爆炸操作(,!!
等),它们的工作方式类似于它们的单爆炸对应操作,但采用阻塞方式。你是否使用它们取决于你自己;如果您坚持使用go
和single bang操作系列,core.async将永远不会启动任何超出上述线程池限制的线程。目前不可能,但没有任何东西可以阻止您修改core.async以支持单线程模型。所有的调度都是通过clojure.core.async.impl.dispatch/run处理的
将该函数更改为使用某种其他调度方法,事情就应该正常工作了。ClojureScript版本的core.async有一个不同版本的调度/运行
,它使用setTimeout(或其他可能更快的东西)。复制该代码,并对其进行修改以在您的虚拟机上工作,这样的更改应该不会那么困难 (go)也是在clj中使用状态机实现的。关于(go)和源代码,请参阅doc,但我指的是ClojureScript使用状态机代替线程,而不是Clojure实现缺少状态机。我很好奇-为什么要避免使用线程?我想在RoboVM上使用core.async进行iOS开发,但后台线程不能在UI上运行。你可以“中断”返回到主线程上,使用此函数在UI上操作:起初,我认为就回答而言,42
是一个可爱的笑话,但后来我检查并发现这是一个真正的可爱笑话。:-)