web-dev-qa-db-ja.com

Scala

In Java Scheduled Executor を使用して、指定された遅延後に実行するタスクをスケジュールできます。Scalaで使用できますが、そのためのScalaAPIがあるかどうか疑問に思います。

タスクをスケジュールするためのScala API(JavaのScheduled Executorとは対照的)はありますか?

13
Michael

Akkaにはスケジューラーと似たようなものがあります。

http://doc.akka.io/api/akka/2.1.4/#akka.actor.Scheduler

アクターシステムから入手できます。

val actorSystem = ActorSystem()
val scheduler = actorSystem.scheduler
val task = new Runnable { def run() { log.info("Hello") } }
implicit val executor = actorSystem.dispatcher

scheduler.schedule(
  initialDelay = Duration(5, TimeUnit.SECONDS),
  interval = Duration(10, TimeUnit.SECONDS),
  runnable = task)

Akkaまたはそれに基づくもの(Playなど)を使用している場合は、それが最適な方法です。

29
Marius Danila

スケジュールされた実行のためのscala apiも探していました。

JavaのScheduledExecutor:

  • スケジューラーの実行とタイムアウトの操作にスレッドプールを使用するため、タイムアウトごとのスレッドは必要ありません
  • アッカは必要ありません

私は少しscalaシングルタスクスケジューリングのラッパーを書きました。要点を参照してください: https://Gist.github.com/platy/8f0e634c64d9fb54559c

6
MikeB

Scalazのタスクを使用できます。

import scala.concurrent.duration.{FiniteDuration, SECONDS}
import scalaz.concurrent.Task
Task.schedule(Console.println("time's up"), FiniteDuration(5, SECONDS)).runAsync { _ => }
4
Sheng

以前は、重複した質問がこのおもちゃになりました。

scala> implicit class Expiry(val d: Deadline) extends AnyVal {
     | def expiring(f: =>Unit) =
     | future(Await.ready(Promise().future, d.timeLeft)) onComplete (_ => f)
     | }
defined class Expiry

scala> val x = new SyncVar[Boolean]()
x: scala.concurrent.SyncVar[Boolean] = scala.concurrent.SyncVar@597d9abe

scala> 10 seconds fromNow expiring {
     | println("That's all, folks.")
     | x.put(true)
     |     }

scala> x.take() 
That's all, folks.
res1: Boolean = true
4
som-snytt

別の方法として、Monixスケジューラーもあります: https://monix.io/docs/3x/execution/scheduler.html

JavaのScheduled Executorを使用しますが、ラップされて透過的です。

実行するには、いくつかのRunnableを実装する必要があります。これは、Akka Actorよりも軽量です。

たとえば、次のことができます(ドキュメントから取得)。

lazy val scheduler =
  Scheduler.singleThread(name="my-thread")

// First execution in 3 seconds, then every 5 seconds
val c = scheduler.scheduleAtFixedRate(
  3, 5, TimeUnit.SECONDS,
  new Runnable {
    def run(): Unit = {
      println("Fixed delay task")
    }
  })

// If we change our mind and want to cancel
c.cancel()
3
JR Utily