我在我的代码中的一些地方使用reducers库,在具有32个内核的生产服务器上利用了一些并行性。但是,Fork / Join框架似乎过于频繁地使用内核,以至于其他进程窒息并且没有响应。
有没有办法限制不行。正在使用的内核或由jvm实例上的reducers库生成的线程?
答案 0 :(得分:2)
似乎无法通过函数或配置参数调整标准reducer forkjoin线程池大小。您需要更改core.reducers
本身。
来自core.reducers来源
(def pool (delay (java.util.concurrent.ForkJoinPool.)))
这与没有参数的默认java构造函数
相对应<强> ForkJoinPool() 强> 使用默认线程工厂,没有UncaughtExceptionHandler和非异步LIFO处理模式,创建一个并行等于Runtime.availableProcessors()的ForkJoinPool。
而不是
ForkJoinPool(int parallelism) 使用指示的并行级别,默认线程工厂,无UncaughtExceptionHandler和非异步LIFO处理模式创建ForkJoinPool。
至少有一个控制核心数量的选项(还有一个更可配置的ForkJoinPool
版本)是一个很好的补充,但是现在唯一的选择是fork core.reducers并将该行更改为您要使用的最大核心数:
(def pool (delay (java.util.concurrent.ForkJoinPool. 28)))