我在具有 32 个内核的生产服务器上的代码中的某些地方使用了 reducers 库,以利用一些并行性。但是 Fork/Join 框架似乎对内核的使用如此之多,以至于其他进程阻塞并变得无响应。
有什么方法可以限制没有。jvm 实例上的reducers 库正在使用的内核或生成的线程?
似乎无法通过函数或配置参数调整标准减速器 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
),这将是一个很好的补充,但目前唯一的选择是分叉 core.reducers 并将该行更改为您要使用的最大内核数:
(def pool (delay (java.util.concurrent.ForkJoinPool. 28)))