我知道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?
答案 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)
}
}