我们的想法是在96核计算机上运行并行作业,并且工作正在窃取ForkJoinPool
。
以下是我目前使用的代码:
import scala.collection.parallel.ForkJoinTaskSupport
import scala.concurrent.forkjoin.ForkJoinPool
val sequence: ParSeq[Item] = getItems().par
sequence.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool())
val results = for {
item <- sequence
res = doSomethingWith(item)
} yield res
此处,sequence
包含约20,000件商品。大多数物品需要2-8秒才能处理,其中只有约200件需要更长时间,大约40秒。
问题:
一切运行良好,然而,工作窃取方面似乎不能很好地运作。以下是与实际负载(蓝色)相比的预期总CPU负载(黑色):
在查看CPU活动时,很明显随着工作的进展,越来越少的核心被使用。在过去的10分钟内,只有2或3个核心仍在忙着依次处理数十个项目。
如果使用ForkJoinPool
这个应该是偷工作的headers: {
Authorization: "Bearer KA.ey**********************************************************************************************************************************"
}
,那么仍然在队列中的项目是否会被其他免费核心窃取?
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html
答案 0 :(得分:1)
每个工作线程都有自己的内部任务队列,可以防止其他线程的工作窃取,从而限制工作者之间的交互。
这可能解释了您所看到的行为,特别是如果您的项目集中出现的长任务不是随机的。