我已经阅读了一些有关如何在Play中处理并发性的教程,并找到了一些示例:

异​​步作业

import scala.concurrent.{ExecutionContext, future}

def sendEmailAsync(from: String, to: String, subject: String, body: String) = {
  import ExecutionContext.Implicits.global // in scala.concurrent

  future {
    EmailHelper.sendEmail(from, to, subject, body)
  }
}

计划作业
import play.api.libs.concurrent.{Akka, Execution}

def sendEmailOnSchedule(from: String, to: String, subject: String, body: String) = {
  import scala.concurrent.duration._
  import Execution.Implicits.defaultContext // in play.api.libs.concurrent

  Akka.system.scheduler.scheduleOnce(10 seconds) {
    EmailHelper.sendEmail(from, to, subject, body)
  }
}

好吧,我有点困惑...第一个示例使用scala.concurrent.ExecutionContext.Implicits.global,而第二个示例使用play.api.libs.concurrent.Execution.Implicits.defaultContext。为什么?有人可以解释一下幕后发生的事情吗?

最佳答案

Scala对某些异步事物( future , promise )使用ExecutionContext。可以将ExecutionContext视为线程池,可以在其中提交Runnables以在其中一个线程上运行。 (它不一定总是一个线程池,但往往是)。

使用ExecutionContext的方式通常是将其作为implicit参数传递给将使用它的函数。您经常会看到这样的方法签名:

def doAsyncThings(args: Args)(implicit exc: ExecutionContext): Future[Result]

“doAsyncThings”方法将使用传入的隐式exc将工作放在单独的线程上。

为了回答您的问题,这两个示例中的Implicits导入是隐式ExecutionContext实例,需要它们来调用futurescheduleOnce方法。出于探索目的,使用哪个都无所谓。 scala库中的global 1包含(iirc)一个具有8个左右线程的线程池。我猜这玩法很相似。除非您对哪些线程可以做什么工作格外小心,否则选择不会影响您。

关于scala - Play 2.1或更高版本中的并发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20621419/

10-10 17:02
查看更多