调度程序设计?同一时间线上的多个事件在不同时间开始



我有多个对象(Object1, Object2和Object3),可能想要利用回调。如果确定要注册一个对象对于周期性回调,它们都将使用30秒的重置率。对象将选择何时注册它想要的回调

如果我想给每个对象它自己的内部定时器(如定时器在一个单独的线程),这将是一个简单的问题。然而,每个计时器需要在一个单独的线程上,这将随着我的对象计数的增长而增长太多。

例如:

在T=10秒运行时,对象1注册回调。由于回调每30秒发生一次,它的下一个fire事件将会发生在T=40,然后T=70, T=100等

假设5秒后(T=15),对象2注册回调。这意味着它的下一次呼叫是在T=45, T=75, T=105等。

在对象2之后1秒,对象3注册回调。它的回调应该在T=46等点被调用。

这是一个肮脏的解决方案,我想让所有东西都从第一个注册的对象计算它的增量。所以对象0是0,对象1是10,对象3是11。然后在一个不断运行的循环中,一旦30秒过去,我就知道了对象0的回调可以处理,然后在10秒内,我可以调用对象1的回调等等。我不喜欢在某种程度上保持忙碌等待,因为while循环必须不断运行。我猜SystemSleep调用使用信号量可能没有那么不同。

我的另一个想法是找到这五个事件之间的最小公倍数。例如,如果我知道有可能每3秒触发一个事件,我就会跟踪它。

我想基本上我要做的是某种简单的调度程序?我敢肯定我不是第一个这样做的人。我正试图想出一个有效的解决方案。一个While循环或者在它们自己的线程上设置一大堆计时器会让这变得容易,但这不是一个好的解决方案。

任何想法?这种设计有名字吗?

通常情况下,您将使用优先级队列,堆或类似的方法来管理使用单个计时器的定时回调。你检查接下来需要调用什么回调,这是你设置的计时器唤醒你的时间。

但是如果所有的回调都使用一个30秒的常量重复,那么你可以只使用一个队列。新的回调作为回调和(绝对)时间戳对添加到末尾,下一个要调用的回调将始终位于前面。每次调用回调时,都将它添加回队列,时间戳增加30s。

最新更新