Akka执行上下文与未来全局上下文

时间:2017-09-11 15:30:10

标签: scala akka threadpool

我知道Akka调度程序与全局执行上下文之间的基本区别。

我用scala.concurrent.ExecutionContext.Implicits.global

尝试了这段代码
import scala.concurrent.ExecutionContext.Implicits.global
  val resultF = (0 to 100).map(
    x =>
      Future {
        val startTime = System.currentTimeMillis()
        val task = Future {
          Thread.sleep(100)
          x
        }
        task.onSuccess {
          case result =>
            val timeRemaining = System.currentTimeMillis() - startTime
            println(s"$result $timeRemaining")
        }
    }
  )
  StdIn.readLine()

上面的代码平均打印的时间等于Thread.sleep(),平均约103毫秒。

但是,下面的代码打印时间为100-400毫秒。

  val system = ActorSystem("test")
  implicit val executionContext = system.dispatcher
  val resultF = (0 to 100).map(
    x =>
      Future {
        val startTime = System.currentTimeMillis()
        val task = Future {
          Thread.sleep(100)
          x
        }
        task.onSuccess {
          case result =>
            val timeRemaining = System.currentTimeMillis() - startTime
            println(s"$result $timeRemaining")
        }
    }
  )
  StdIn.readLine()

我无法理解除thread-pool之外的主要区别是什么。

1 个答案:

答案 0 :(得分:0)

  

我没有理解除了使用线程池之外的主要区别。

唯一的区别是使用的线程池及其工作调度算法。

Akka ActorSystem线程池是一个fork-join执行器,如http://doc.akka.io/docs/akka/2.5/scala/dispatchers.html所述

"全球"默认的ExecutionContext是一个工作窃取线程池,参见例如https://github.com/scala/scala/blob/v2.12.3/src/library/scala/concurrent/ExecutionContext.scala#L135

参见例如How is the fork/join framework better than a thread pool?