Параллелизм в игре 2.1 или выше

Я прочитал несколько уроков о том, как работать с параллелизмом в 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, Зачем? Может ли кто-нибудь объяснить мне, что происходит за кулисами?

2 ответа

Решение

Скала использует ExecutionContext для некоторых асинхронных вещей (Фьючерсы, Обещания). ExecutionContext можно рассматривать как пул потоков, в котором Runnables можно отправить для запуска в одном из потоков. (Это не обязательно всегда пул потоков, но, как правило, это так).

Метод ExecutionContext обычно используется для передачи его в виде implicit аргумент функции, которая будет использовать его. Вы часто будете видеть сигнатуры методов, как это:

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

Метод doAsyncThings будет использовать неявный exc это передается, чтобы поместить работу в отдельный поток.

Чтобы ответить на ваш вопрос, Implicits импорт из двух примеров - это неявные экземпляры ExecutionContext, которые необходимы для вызова future а также scheduleOnce методы. Для исследовательских целей не имеет значения, какой вы используете. global один из библиотеки scala содержит (iirc) пул потоков с 8 или около того потоками. Я бы догадался, что пьеса одна похожа. Если вы не слишком осторожны в отношении того, какие потоки выполняют какую работу, выбор не должен влиять на вас.

Я предполагаю, что разница происходит от "10 секунд". способность буквально называть времена как не встроена в язык. "секунд" неявно преобразуется в DurationInt.

Другие вопросы по тегам