Запланированный исполнитель в Scala

В Java я могу использовать Scheduled Executor для планирования задач, которые будут выполняться после определенной задержки. Я могу использовать его в Scala, но мне интересно, существует ли для этого Scala API.

Есть ли какой-либо Scala API (в отличие от Scheduled Executor в Java) для планирования задач?

Ответы

Ответ 1

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, это будет способ.

Ответ 2

Раньше в эту игру входил дублированный вопрос.

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] = [email protected]

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

scala> x.take() 
That all, folks.
res1: Boolean = true

Ответ 3

Я искал scala api для запланированного выполнения.

Java ScheduledExecutor:

  • использует пул потоков для запуска планировщика и использования тайм-аутов, и поэтому не требуется поток за время ожидания
  • Не требуется akka

Я написал небольшую оболочку scala для планирования отдельных задач. См. Суть: https://gist.github.com/platy/8f0e634c64d9fb54559c

Ответ 4

Вы можете использовать задачу scalaz,

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

Ответ 5

В качестве альтернативы есть и планировщик 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()