2015-11-25 44 views
4

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

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

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

+0

它是否必须是调度程序?为什么不只是一个将消息分发给代理的递归函数? –

+0

@ RamonJ.RomeroyVigil抱歉,我没有关注。你能提供一些你想要的更多描述吗? – davidrpugh

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

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

+0

@ RamonJ.RomeroyVigil谢谢。我不认为这个递归函数调用会为我想做的事情工作。我想,我想,Akka调度程序的行为就像优先级队列,队列中的对象按照仿真时间排序。 – davidrpugh

+0

@davidrpugh不客气。正如我在答复中所说的那样,我不认为调度人员有这些诀窍。快乐的黑客攻击。 –