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

稍有不同,我希望调度程序表现得好像它是一种优先级队列,其中优先级由事件的模拟时间戳给出。

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

最佳答案

我认为 akka 调度程序不可能做到这一点。来自 documentation(强调我的):



但是,您始终可以使用递归函数完成相同的事情。假设您的“实时”功能如下所示:

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)
}

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

关于scala - 模拟时间和 Akka 调度器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33915856/

10-13 04:43