【发布时间】:2013-02-12 00:58:14
【问题描述】:
假设我想每小时运行一次任务,但每小时运行一次。它不一定是真正随机的。例如,我只是不想在每小时的最开始做这件事。而且我只想每小时执行一次。
这消除了几种明显的方法,例如随机睡 30 到 90 分钟,然后再睡。该任务有可能(并且很有可能)连续运行多次,睡眠时间不超过 30 分钟。
我正在考虑的方法是这样的:每隔一小时,对一小时的 Unix 时间戳进行哈希处理,然后将结果修改为 3600。将结果添加到一小时的 Unix 时间戳,这就是任务的时刻应该运行。在伪代码中:
while now = clock.tick; do
// now = a unix timestamp
hour = now - now % 3600;
hash = md5sum(hour);
the_time = hour + hash % 3600;
if now == the_time; then
do_the_work();
end
end
我确信这会满足我的要求,但我认为把这个问题抛出来看看其他人有什么想法会很有趣!
【问题讨论】:
-
但是明天上午 9:00 与今天上午 9:00 的 Unix 时间戳不同,因此会有不同的输入。我忘了说我使用的是 Unix 时间戳。将更新问题。
-
我不确定我是否完全按照。如果总持续时间是例如10 小时,您希望任务恰好运行 10 次?
-
好问题。我看我并没有真正陈述一个假设。这是一个每秒循环一次的长时间运行(永远运行?)的程序。它每秒钟都在做大量的工作。每小时一次,但在一个可变的时间,我希望它做另一个小任务。
-
我突然想到,我可以使用小时的时间戳作为 rand() 的种子,而不是使用哈希函数。结果仍然是可预测的,但可能具有更好的分布,具体取决于散列函数。