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