安排重复事件 Akka
Schedule repeating event Akka
在 Akka 应用程序中,可以使用 context.system.scheduler.schedule
安排 Actor 在将来重复执行某些操作,然后传递一个 initialDelay
,然后传递一个 interval
。我希望间隔是随机的(即,如果我希望对泊松过程建模,则从指数分布中得出)。
如何使用 Akka Scheduler 安排事件在未来随机发生?
如果我正确理解你的问题,你希望能够在调度程序中调整间隔,这是不可能的,因为它当然是不可变的,但你可以使用 scheduleOnce
和随时调整延迟:
case object DoSomething
class MyActor() extends Actor {
var delay = 10
context.system.scheduler.scheduleOnce(delay seconds, self, DoSomething)
def receive: Receive = {
case DoSomething =>
doSomething()
}
def doSomething(): Unit = {
/** do something */
delay = delay * 2
context.system.scheduler.scheduleOnce(delay seconds, self, DoSomething)
()
}
}
您可以安排一次该进程,它将触发 doSomething()
方法,该方法将以不同的延迟对另一个计划的作业进行排队。
这可以通过递归函数来完成:
def doSomething : Unit = ???
def randomIntervalGenerator : FiniteDuration = ???
@scala.annotation.tailrec
def randomSchedule(count : Int) : Unit =
if(count > 0) {
Thread sleep randomIntervalGenerator.toMillis
doSomething
randomSchedule(count -1)
}
在 Akka 应用程序中,可以使用 context.system.scheduler.schedule
安排 Actor 在将来重复执行某些操作,然后传递一个 initialDelay
,然后传递一个 interval
。我希望间隔是随机的(即,如果我希望对泊松过程建模,则从指数分布中得出)。
如何使用 Akka Scheduler 安排事件在未来随机发生?
如果我正确理解你的问题,你希望能够在调度程序中调整间隔,这是不可能的,因为它当然是不可变的,但你可以使用 scheduleOnce
和随时调整延迟:
case object DoSomething
class MyActor() extends Actor {
var delay = 10
context.system.scheduler.scheduleOnce(delay seconds, self, DoSomething)
def receive: Receive = {
case DoSomething =>
doSomething()
}
def doSomething(): Unit = {
/** do something */
delay = delay * 2
context.system.scheduler.scheduleOnce(delay seconds, self, DoSomething)
()
}
}
您可以安排一次该进程,它将触发 doSomething()
方法,该方法将以不同的延迟对另一个计划的作业进行排队。
这可以通过递归函数来完成:
def doSomething : Unit = ???
def randomIntervalGenerator : FiniteDuration = ???
@scala.annotation.tailrec
def randomSchedule(count : Int) : Unit =
if(count > 0) {
Thread sleep randomIntervalGenerator.toMillis
doSomething
randomSchedule(count -1)
}