是否可以在Clojure中使用ClojureScript的基于状态机的core.async实现,而不是Clojure的基于线程的实现?我希望能够在JVM上使用core.async,但不使用线程。
发布于 2014-02-12 18:21:44
目前这是不可能的,但是没有什么可以阻止您修改core.async以支持单个线程模型。所有的调度都是通过clojure.core.async.impl.dispatch/run来处理的,将该函数更改为使用某种其他的调度方法,并且一切都应该正常工作。ClojureScript版本的core.async有一个不同版本的dispatch/run,它使用setTimeout (或其他可能更快的东西)。复制该代码,并修改它以在您的VM上工作,这不应该是很难改变的。
发布于 2014-02-12 13:00:54
在JVM上不可能以严格的单线程方式使用core.async,除非您愿意深入内部,并将用于go的线程池替换为只使用单个线程的线程池。
然而,正如edbond在他的评论中指出的那样,Clojure版本的core.async确实使用状态机来处理go。然后,这些状态机运行在线程池上,线程池的大小限制为处理器+ 42的两倍,因此可以在不使用尽可能多的实际线程的情况下启动数千个go。
JVM core.async还提供了一个像go一样工作的thread宏,但是启动真正的线程,再加上一组双击操作(<!!、>!!等)。就像他们的单枪匹马一样,但是以一种封闭的方式。是否使用它们取决于您自己;如果您坚持使用go和单击操作系列,core.async将永远不会启动超过上述线程池限制的线程。
https://stackoverflow.com/questions/21725911
复制相似问题