我根本没有在 Clojure 中使用过多线程,所以不确定从哪里开始。
我有一个doseq
身体可以并行运行。我想要的是总是有 3 个线程在运行(留下 1 个核心空闲)并行评估主体,直到范围用完。没有共享状态,没有什么复杂的——相当于 Python 的多处理就可以了。
所以像:
(dopar 3 [i (range 100)]
; repeated 100 times in 3 parallel threads...
...)
我应该从哪里开始寻找?有这个命令吗?标准包装?一个好的参考?
到目前为止,我已经找到pmap
,并且可以使用它(我如何一次限制为 3 个?看起来它一次使用 32 个- 不,消息来源说 2 + 个处理器),但似乎这是一个基本的原语那应该已经存在于某个地方。
澄清:我真的很想控制线程数。我有长时间运行的进程并使用大量内存,因此创建大量进程并希望一切正常并不是一个好方法(使用大量可用内存的示例)。
更新:开始编写执行此操作的宏,我需要一个信号量(或互斥体,或我可以等待的原子)。Clojure 中是否存在信号量?或者我应该使用 ThreadPoolExecutor?不得不从 Java 中提取这么多东西似乎很奇怪——我认为 Clojure 中的并行编程应该很容易......也许我在想这个完全错误的方式?嗯。代理?