Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Play 2.1或更高版本中的并发性_Scala_Playframework_Executioncontext - Fatal编程技术网

Scala Play 2.1或更高版本中的并发性

Scala Play 2.1或更高版本中的并发性,scala,playframework,executioncontext,Scala,Playframework,Executioncontext,我已经阅读了一些关于如何在游戏中处理并发性的教程,并找到了一些示例: 异步作业 import scala.concurrent.{ExecutionContext, future} def sendEmailAsync(from: String, to: String, subject: String, body: String) = { import ExecutionContext.Implicits.global // in scala.concurrent future {

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

异步作业

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)
  }
}
计划作业

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使用
ExecutionContext
来处理一些异步的事情(未来、承诺)。ExecutionContext可以被看作是一个线程池,其中可以提交
可运行文件
,以便在其中一个线程上运行。(它不一定总是一个线程池,但它往往是)

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

def doAsyncThings(args: Args)(implicit exc: ExecutionContext): Future[Result]
“doAsyncThings”方法将使用传入的隐式
exc
,将工作放到单独的线程上


为了回答您的问题,从这两个示例导入的
Implicits
是implicit ExecutionContext实例,调用
future
scheduleOnce
方法时需要这些实例。出于探索的目的,使用哪一个并不重要。scala库中的
global
包含(iirc)一个包含8个左右线程的线程池。我猜这出戏是相似的。除非您特别注意哪些线程起作用,否则选择不会影响您。

我猜差异来自“10秒”。这种语言没有像字面上那样命名时间的能力。“秒”隐式转换为持续时间

ExecutingContext
类似于java的ExecutorService(线程池),您甚至可以自己创建它。例如,play slick模块使用一个单独的上下文来执行db操作。这与调度程序无关,它来自于
scala.concurrent.duration.\uu
import。