Параллелизм в игре 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.