Scala 模拟时间和Akka调度器

Scala 模拟时间和Akka调度器,scala,akka,scheduler,Scala,Akka,Scheduler,我正在使用Akka构建一个多代理模拟,因此我希望运行模拟的速度比实时速度更快。具体地说,我想配置Akka调度程序,以使调度程序从一个调度的事件前进到下一个事件(这显然可能涉及事件之间实质上不同的时间步),而不是通过一些基本的固定时间步前进 换言之,我希望调度器的行为就像它是一种优先级队列,其中优先级由事件的模拟时间戳给出 清楚了吗?如果是这样的话,我想使用Actor系统的默认调度程序做什么?如果这是不可能的,那么我将如何使用现有的Akka组件滚动我自己的调度器来完成这项任务。我认为Akka调度器

我正在使用Akka构建一个多代理模拟,因此我希望运行模拟的速度比实时速度更快。具体地说,我想配置Akka调度程序,以使调度程序从一个调度的事件前进到下一个事件(这显然可能涉及事件之间实质上不同的时间步),而不是通过一些基本的固定时间步前进

换言之,我希望调度器的行为就像它是一种优先级队列,其中优先级由事件的模拟时间戳给出


清楚了吗?如果是这样的话,我想使用Actor系统的默认调度程序做什么?如果这是不可能的,那么我将如何使用现有的Akka组件滚动我自己的调度器来完成这项任务。

我认为Akka调度器不可能做到这一点。从(我的)重点:

有时需要让事情在未来发生,并且 那你去哪里看?不要再看ActorSystem了!给你 查找返回的实例的调度程序方法 akka.actor.Scheduler,此实例对于每个ActorSystem是唯一的,并且 在内部用于安排在特定点发生的事情 及时地

但是,使用递归函数始终可以完成相同的任务。假设您的“实时”功能类似于:

def periodicFunction() : Unit = ???  //whatever you're doing to Agents

//periodicFunction is called every 10 seconds
actorSystem.scheduler().schedule(0 seconds, 10 seconds)(periodicFunction())
您的模拟代码可以是:

@scala.annotation.tailrec
def fasterThanRealTimeLoop(n : Int) = 
  if(n > 0) {
    periodicFunction()

    fasterThanRealTimeLoop(n-1)
  }
然后,你可以模拟20次跑步

fasterThanRealTimeLoop(20)
可以进一步包装此功能,以封装两种可能性:

val realtimeMode : Boolean = ??? //some configuration setting

val periodicArgs : Either[FiniteDuration, Int] = 
  if(realtimeMode) Left(10 Seconds) else Right(20)

periodicArgs.left.foreach { period => 
  actorSystem.scheduler().schedule(0 seconds, period)(periodicFunction())
}

periodicArgs.right.foreach { count => 
  fasterThanRealTimeLoop(count)
}

此代码现在将根据配置设置调用正确类型的循环(定时或尽可能快)。

它必须是计划程序吗?为什么不只是一个向代理发送消息的递归函数?@RamonJ.RomeroyVigil抱歉,我不懂。你能再描述一下你的想法吗?我会用一个例子来回答。如果不是你想要的,我可以删除…。。@RamonJ.RomeroyVigil谢谢。我认为这个递归函数调用不适合我想要做的事情。我想,我想要的是Akka调度程序的行为像一个优先级队列,队列中的对象按模拟时间排序。@davidrpugh不客气。正如我在回答的顶部所说,我不认为调度器在它的技巧包中包含了这一点。快乐黑客。