j3d*_*j3d 6 scala playframework executioncontext
我已经阅读了一些关于如何在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)
}
}
Run Code Online (Sandbox Code Playgroud)
预定的工作
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)
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,我有点困惑......第一个例子使用,scala.concurrent.ExecutionContext.Implicits.global而第二个例子使用play.api.libs.concurrent.Execution.Implicits.defaultContext.为什么?有人能解释一下幕后发生的事吗?
Scala 使用 anExecutionContext来处理一些异步事物(Futures、Promises)。ExecutionContext 可以被认为是一个线程池,Runnables可以提交其中的一个线程来运行。(它不一定总是线程池,但它往往是)。
使用 ExecutionContext 的方式通常是将其作为implicit参数传递给使用它的函数。您经常会看到这样的方法签名:
def doAsyncThings(args: Args)(implicit exc: ExecutionContext): Future[Result]
Run Code Online (Sandbox Code Playgroud)
“doAsyncThings”方法将使用exc传入的隐式方法将工作放到单独的线程上。
为了回答您的问题,Implicits这两个示例的导入是隐式 ExecutionContext 实例,需要调用future和scheduleOnce方法。出于探索目的,使用哪一个并不重要。globalscala 库中的一个包含 (iirc) 一个具有 8 个左右线程的线程池。我猜想这部剧也是类似的。除非您特别注意哪些线程执行哪些工作,否则该选择不会影响您。
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |