タスクを 1 時間に 1 回実行したいが、1 時間中の可変時間に実行したいとします。完全にランダムである必要はありません。たとえば、毎正時にやりたくないだけです。そして、1時間に1回だけやりたいです。
これにより、30 分から 90 分のランダムな時間スリープしてから再びスリープするなど、いくつかの明白なアプローチが排除されます。タスクが 30 分強のスリープ状態で連続して数回実行される可能性はあります (かなりの可能性があります)。
私が考えているアプローチは次のようになります: 1 時間ごとに、その時間の 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
これは私の要件を満たすと確信していますが、この質問を投げ捨てて、他の人がどんなアイデアを持っているかを見るのは楽しいだろうと思いました!