【问题标题】:Scheduled Executor in ScalaScala 中的计划执行程序
【发布时间】:2013-05-13 14:11:14
【问题描述】:

在 Java 中,我可以使用 Scheduled Executor 来安排任务在给定延迟后运行。我可以在 Scala 中使用它,但我想知道是否有 Scala API 用于此。

是否有任何 Scala API(相对于 Java 中的 Scheduled Executor)来安排任务?

【问题讨论】:

    标签: scala scheduled-tasks


    【解决方案1】:

    作为替代方案,还有 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()
    

    【讨论】:

      【解决方案2】:

      你可以使用scalaz的Task,

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

      【讨论】:

        【解决方案3】:

        我也一直在寻找用于计划执行的 scala api。

        Java 的 ScheduledExecutor:

        • 使用线程池来运行调度程序和操作超时,因此每次超时都不需要线程
        • 不需要akka

        我为单个任务调度编写了一个小的 scala 包装器。见要点: https://gist.github.com/platy/8f0e634c64d9fb54559c

        【讨论】:

          【解决方案4】:

          Akka 与调度器有一些相似之处:

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

          你可以从actor系统中获取一个:

          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,那将是正确的选择。

          【讨论】:

          • 为什么人们认为 Scala == Akka?
          • 哦,谢谢你写这篇文章。我是 Scala 新手,每次我在谷歌上搜索有关 Scala 的任何内容时,我都会找到与 Akka 相关的答案。你的评论让我很清楚。
          • @marius 这仅适用于println 函数。我是否需要做其他事情才能使其适用于任何其他功能(特别是同一类的方法)。
          • 看起来这在控制器层中不适用于 Action.async 类型的类方法。真的不知道原因,但它在项目的另一层对我有用。
          • Akka 就像一个病毒。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-19
          • 2017-08-22
          • 2015-06-16
          • 2015-09-27
          • 1970-01-01
          • 1970-01-01
          • 2022-12-01
          相关资源
          最近更新 更多