Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can ClojureScript';是否在Clojure中使用core.async的实现?_Clojure_Clojurescript_Core.async - Fatal编程技术网

Can ClojureScript';是否在Clojure中使用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

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

在JVM上无法以严格的单线程方式使用core.async,除非您愿意深入到内部并将用于
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
是一个可爱的笑话,但后来我检查并发现这是一个真正的可爱笑话。:-)