模拟时间和Akka调度程序

时间:2015-11-25 11:53:17

标签: scala akka scheduler

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

略有不同,我希望调度程序的行为就好像它是一种优先级队列,其优先级由事件的模拟时间戳给出。

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

1 个答案:

答案 0 :(得分:1)

我不认为这可以通过akka调度程序实现。来自documentation(强调我的):

  

有时需要在未来发生事情,并且   那你去哪儿看?请看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)
}

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