2013-02-12 2 views
1

Предположим, что я хочу запускать задачу один раз в час, но с переменным временем в течение часа. Это не должно быть по-настоящему случайным; Например, я просто не хочу делать это в верхней части часа каждый час. И я хочу делать это один раз в час.Как выбрать случайное время один раз в час

Это устраняет несколько очевидных подходов, таких как спящий случайный промежуток времени от 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 

я уверен, что это будет соответствовать моим требованиям, но я думал, что это было бы интересно, чтобы бросить этот вопрос и посмотреть, что идеи других людей!

+0

Но завтра в 9:00 утра не то же самое Отметка времени Unix, как сегодня в 9:00 утра, поэтому будет другой вход. Я пренебрег тем, что использовал временную метку Unix. Обновит вопрос. –

+0

Я не уверен, что я точно следую. Если общая продолжительность составляет, например, 10 часов, вы хотите, чтобы задача выполнялась ровно десять раз? –

+0

Хороший вопрос. Я вижу, я действительно не высказывал предположения. Это длительная (работает навсегда?) Программа, которая петли раз в секунду.Это делает кучу работы каждую секунду. Один раз в час, но с переменным временем, я хочу, чтобы он выполнял еще одну небольшую задачу. –

ответ

0
  1. Запланируйте задачу (с помощью cron или т.п.) для запуска в верхней части каждого часа.

  2. В начале вашей задачи, сон для случайного количества времени, от 0 до (60 - (расчетного времени запуска вашей задачи + Фактора выдумки)) минут.

  3. Если вы не хотите, чтобы ваша задача выполнялась дважды одновременно, вы можете использовать файл pid. Задача может проверить - после сна - для этого файла и дождаться завершения текущей задачи перед запуском.

+0

У меня такие же комментарии об этой идее, как и о идее pst; существует некоторая сложность, связанная с обработкой ошибок. Хорошая идея. –

1

В течение следующего часа, чтобы выполнить работу, просто выберите случайную минуту в течение этого часа.

То есть, выберите случайное время для next интервал для работы; это может быть тот же интервал (час), что и текущий интервал (час), если работа перенесена с предыдущего интервала.

«Время спать» - это просто время до этого времени. Это также можно было бы выполнить «немедленно» в ситуации переноса, если случайное время было до этого: это обеспечит выбор случайного времени каждый час, если только работа занимает больше часа.

Не делайте это более сложным, чем это должно быть - нет никаких оснований хешировать или иначе гадать с random здесь. Вот как работают «корпоративные» решения, такие как SharePoint Timers (с часовым графиком).

+0

Я бы согласился, но это связано с тем, что это позволяет повторять работу в случае сбоя. Например, если процесс перезапускается и теряет выбранный им вариант. Выбор можно сделать достаточно прочным с легко доступной технологией, но это сложно и не гарантировано гарантированно долго (спросите меня, как я знаю!) На самом деле я не думаю, что моя идея сложнее, чем ваша, хотя пожалуйста не воспринимайте это как критику своей идеи. Весь смысл этого сообщения состоял в том, чтобы стимулировать творческие идеи :) –

+0

С другой стороны, если вы хотите непредсказуемый выбор времени, ваша идея явно лучше. Моя идея выбирает переменное, но вполне предсказуемое время. –

+0

@BaronSchwartz Я просто убираю то, что знаю для таймера/расстояния работы. Для обработки ситуаций восстановления ошибок хранилище «ACID» работает достаточно хорошо, хотя такие ограничения могут быть смягчены до чего-то столь же простого, как файл контролера или контрольный контейнер. Я не совсем уверен, почему предсказуемое, но непостоянное время, полученное из формулы, было бы полезно в течение «20 минут за час» (что само по себе является одним из возможных способов указать в следующий раз). – 2013-02-12 03:09:58

0

Я развернул свое предлагаемое решение и работает очень хорошо. Например, один раз в минуту я собираю некоторую информацию из процесса, который я контролирую, но я делаю это с переменным временем в течение минуты. Я создал метод типа Timestamp, называется RandomlyWithin, следующим образом, в Go Код:

func (t Timestamp) RandomlyWithin(dur Timestamp, entropy ...uint32) Timestamp { 
    intervalStart := t - t % dur 
    toHash := uint32(intervalStart) 
    if len(entropy) > 0 { 
     toHash += entropy[0] 
    } 
    md5hasher.Reset() 
    md5hasher.Write([]byte{ 
     uint8(toHash >> 24 & 255), 
     uint8(toHash >> 16 & 255), 
     uint8(toHash >> 8 & 255), 
     uint8(toHash & 255)}) 
    randomNum := binary.BigEndian.Uint32(md5hasher.Sum(nil)[0:4]) 
    result := intervalStart + Timestamp(randomNum)%dur 
    return result 
} 
Смежные вопросы