1

Scala 2.10 では、新しいFuture/ PromiseAPI とともに、DurationおよびDeadlineユーティリティが導入されました (ここで説明されています)。私は周りを見回しましたが、次のようなことをするためのscala標準ライブラリに付属するものは何も見つかりませんでした:

val deadline = 5 seconds fromNow
After(deadline){
  //do stuff
}

//or

val deadlineFuture: Future[Nothing] = (5 seconds fromNow).asFuture
deadlineFuture onComplete {
  //do stuff
}

私が見逃したようなものはありますか、それともこの種の動作を自分で実装する必要がありますか?

4

2 に答える 2

4

完全に組み込まれているわけではありませんが、十分なロープを提供します。

要点は、期待を裏切らなければならない (つまり、タイムアウトになる) 空の約束を待つことです。

import scala.concurrent._
import scala.concurrent.duration._
import scala.util._
import ExecutionContext.Implicits.global

object Test extends App {
  val v = new SyncVar[Boolean]()
  val deadline = 5 seconds fromNow
  future(Await.ready(Promise().future, deadline.timeLeft)) onComplete { _ =>
    println("Bye, now.")
    v.put(true)
  }
  v.take()
  // or
  val w = new SyncVar[Boolean]()
  val dropdeadline = 5 seconds fromNow
  val p = Promise[Boolean]()
  p.future onComplete {_ =>
    println("Bye, now.")
    w.put(true)
  }
  Try(Await.ready(Promise().future, dropdeadline.timeLeft))
  p trySuccess true
  w.take()
  // rolling it
  implicit class Expiry(val d: Deadline) extends AnyVal {
    def expiring(f: =>Unit) {
      future(Await.ready(Promise().future, d.timeLeft)) onComplete { _ =>
        f
      }
    }
  }
  val x = new SyncVar[Boolean]()
  5 seconds fromNow expiring {
    println("That's all, folks.")
    x.put(true)
  }
  x.take() // wait for it
}
于 2012-12-13T03:02:20.150 に答える
0

その単なるタイムスタンプホルダー。たとえば、N 個の連続したタスクの実行を T 時間に分散する必要があるとします。最初のタスクが終わったら、締め切りを確認し、(残り時間)/(残りタスク) 間隔に応じて次のタスクをスケジュールします。ある時点でisOverdue()発生し、残りのタスクを並行して実行するだけです。

または、 をチェックisOverdue()して、それでも false の場合はtimeLeft()、たとえば、次のタスクの実行時にタイムアウトを設定するために使用できます。

Dateで操作してCalendar残り時間を決定するよりもはるかに優れています。また、Duration はタイミングのために Akka で使用されました。

于 2012-12-13T01:44:35.330 に答える