我正在使用Akka构建多代理模拟,因此希望比实时更快地运行模拟。具体来说,我想配置Akka调度程序,以便调度程序从一个预定事件前进到下一个预定事件(显然可能涉及事件之间明显不同的时间步长),而不是通过一些基础固定时间步骤前进。
略有不同,我希望调度程序的行为就好像它是一种优先级队列,其优先级由事件的模拟时间戳给出。
这是否清楚?如果是这样,我想使用Actor系统的默认调度程序做什么?如果这是不可能的,那么我将如何使用现有的Akka组件来完成此任务。答案 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)
}
此代码现在将根据配置设置调用正确类型的循环(定时或尽可能快)。