加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何设置Scala 2.10并行集合的默认线程数?

发布时间:2020-12-16 19:05:13 所属栏目:安全 来源:网络整理
导读:在2.10之前的 Scala中,我可以在defaultForkJoinPool中设置并行度(如在这个答案 scala parallel collections degree of parallelism中).在Scala 2.10中,该API不再存在.有充分的记录,我们可以通过分配到其taskSupport属性来将并行性设置在单个集合( http://doc
在2.10之前的 Scala中,我可以在defaultForkJoinPool中设置并行度(如在这个答案 scala parallel collections degree of parallelism中).在Scala 2.10中,该API不再存在.有充分的记录,我们可以通过分配到其taskSupport属性来将并行性设置在单个集合( http://docs.scala-lang.org/overviews/parallel-collections/configuration.html)上.

但是,我使用并行集合遍及我的代码库,并且不想为每个集合实例化添加额外的两行.有没有办法配置全局默认线程池大小,以便someCollection.par.map(f(_))自动使用默认线程数?

解决方法

我知道问题是一个多月了,但我刚刚有同样的问题.谷歌搜索是没有帮助的,我找不到任何看起来在新的API的中途理智.

设置-Dscala.concurrent.context.maxThreads = n,如下所示:Set the parallelism level for all collections in Scala 2.10?似乎没有任何效果,但我不知道我是否正确使用它(我在没有“scala”的环境中运行我的应用程序“java”明确安装,可能是原因).

我不知道为什么scala人从相应的包对象中删除了这个必要的设置器.

然而,通常可以使用反射来解决不完整/奇怪的界面:

def setParallelismGlobally(numThreads: Int): Unit = {
  val parPkgObj = scala.collection.parallel.`package`
  val defaultTaskSupportField = parPkgObj.getClass.getDeclaredFields.find{
    _.getName == "defaultTaskSupport"
  }.get

  defaultTaskSupportField.setAccessible(true)
  defaultTaskSupportField.set(
    parPkgObj,new scala.collection.parallel.ForkJoinTaskSupport(
      new scala.concurrent.forkjoin.ForkJoinPool(numThreads)
    ) 
  )
}

对于那些不太了解Scala更晦涩的功能的人来说,这是一个简短的解释:

scala.collection.parallel.`package`

使用defaultTaskSupport变量访问包对象(它看起来像Java的静态变量,但它实际上是包对象的成员变量).标识符需要反引号,因为包是保留关键字.然后我们得到我们想要的私有final字段(getField(“defaultTaskSupport”)由于某种原因不起作用…),告诉它可以访问以便能够修改它,然后将其替换为我们自己的ForkJoinTaskSupport.

我还不明白创建并行集合的确切机制,但是Combiner trait的源代码表明defaultTaskSupport的值应该以某种方式渗透到并行集合中.

请注意,这个问题在质量上与一个较老的问题是一样的:“我的Math.random()遍及我的代码库,如何将种子设置为固定号码进行调试? (参见例如:Set seed on Math.random()).在这两种情况下,我们都有一些全局的“静态”变量,我们隐含地在一百万个不同的地方使用,我们要改变它,但是这个变量没有setter =>我们用反思

丑陋的地狱,但似乎工作正常.如果需要限制总线程数,不要忘记垃圾回收器在单独的线程上运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读