Akka的fork-join-executor是否使用了scala.concurrent.blocking?

时间:2016-09-13 10:22:23

标签: scala playframework akka

我知道scala.concurrent.blocking是ExecutionContext的提示,一段代码在某些IO上执行一些长操作/块。 ExecutionContext可以(但不是必须)使用这个“提示”。

如下所述:

scala.concurrent.blocking - what does it actually do?

http://www.cakesolutions.net/teamblogs/demystifying-the-blocking-construct-in-scala-futures

scala.concurrent.ExecutionContext.Implicits.global是一个ForkJoinPool,它为包含在scala.concurrent.blocking中的代码生成一个新线程。

Akka的fork-join-executor怎么样?它是否也以任何方式使用scala.concurrent.blocking?

1 个答案:

答案 0 :(得分:2)

是的,确实如此!

通过搜索BlockContext来解决这个问题很容易。对于Akka,它引导我们here,如果您按照代码和文档中的主题进行操作,则可以确认它。

这也很容易自己测试。我们可以在没有任何已配置的调度程序的情况下创建一个新的ActorSystem(因此它将使用默认的fork-join-executor),然后将其调度程序用作我们的ExecutionContext

import akka.actor._
import scala.concurrent._

implicit val ec = ActorSystem("test").dispatcher

首先,在没有阻止的情况下,您会注意到几个期货立即开始,但不是全部。另一批次将在第一批完成时开始。显然,默认池达到了饥饿状态:

(0 to 100) foreach { n =>
    Future {
        println("starting Future: " + n)
        Thread.sleep(3000)
        println("ending Future: " + n)
    }
}

然后,blocking所有期货应该立即执行,而不是前面的例子:

(0 to 100) foreach { n =>
    Future {
        println("starting Future: " + n)
        blocking(Thread.sleep(3000))
        println("ending Future: " + n)
    }
}