2016-11-21 1 views
0

Использование Scala 2.11.8, учитывая, что Future спит 5 секунд, прежде чем вернуться (), я назвал akka.pattern.ask с тайм-аут 1 второй:`akka.pattern.after` - Понимание аргумента` duration`?

import scala.concurrent.duration._ 
import scala.concurrent._ 
import akka.actor.ActorSystem 
import scala.concurrent.ExecutionContext.Implicits.global 
import akka.pattern.after 

val system = ActorSystem.create() 

after(FiniteDuration(1, SECONDS), system.scheduler)(Future{ Thread.sleep(5000);() }) 
res15: scala.concurrent.Future[Unit] = List() 

// roughly 5 seconds later, I see: 

scala> res15 
res22: scala.concurrent.Future[Unit] = Success(()) 

Почему не res15 возвращающие Failure с Future не завершена до 5 секунд, однако его тайм-аут составляет 1 секунду?

+0

Что это связано с 'ask'? –

+0

Ничего, @ m-z. Я только что отредактировал - спасибо. –

ответ

3

After метод запустит ваше будущее после некоторой задержки. duration не является таймаутом, его стартовая задержка. After способ внутренне использует scheduleOnce способ актерсистема расписание.

After - очень интересный метод, который начинает оценивать/исполнять ваше будущее выражение (например, value) только после определенной заданной продолжительности.

Если заданная длительность очень мала, то она немедленно начинает выполнять value.

Поскольку value является параметром имени по имени, значение не оценивается сразу. value будет оцениваться только при явном вызове по значению имени.

Адрес: akka lib.

def after[T](duration: FiniteDuration, using: Scheduler)(value: ⇒ Future[T])(implicit ec: ExecutionContext): Future[T] = 
    if (duration.isFinite() && duration.length < 1) { 
    try value catch { case NonFatal(t) ⇒ Future.failed(t) } 
    } else { 
    val p = Promise[T]() 
    using.scheduleOnce(duration) { p completeWith { try value catch { case NonFatal(t) ⇒ Future.failed(t) } } } 
    p.future 
} 

В основном ваша продолжительность будет вызывать следующий код

using.scheduleOnce(duration) { p completeWith { try value catch { case NonFatal(t) ⇒ Future.failed(t) } } } 

Приведенный выше код будет приступить к выполнению в будущем после задержки (duration задержка.).

Важные замечания:

отмечают, что value является вызов параметром имя. значение будет оцениваться при вызове по имени, что означает, что ваше будущее не будет запускаться до тех пор, пока значение не будет вызвано явно. value называется внутри try, потому что value может быть многострочным выражением, которое содержит много кода и которое, наконец, возвращает будущее.

Promise (см. Код) заставит вас ждать незаметно, пока будущее не завершится его исполнением. promise.future будет завершен только в том случае, если данное будущее завершено.