Как вы вызываете метод каждый час в Rails?

#ruby-on-rails #ruby #methods #time #resque

#ruby-on-rails #ruby #методы #время #resque

Вопрос:

Я использую Resque с Redis для обработки фонового задания. Я хотел бы вызывать метод Resque.enqueue(MyModel) только один раз в час для выполнения фоновой задачи.

Например: допустим, у меня есть сайт, на котором 10 000 пользователей. Я хотел бы вызывать этот метод только 24 раза в день; не 10000 * 24. Пример метода приведен ниже:

 Resque.enqueue(MyModel)
  

Заранее благодарю вас за помощь. Я должен также упомянуть, что я предпочитаю придерживаться Resque, а не переходить к отложенному заданию. Спасибо.

Комментарии:

1. Бесконечный цикл while, сначала вызываете метод, а затем переходите в режим ожидания 3600 секунд?

2. Как бы вы посмели 🙂 для этого есть специальные инструменты!

3. @apneadiving tbh, в таком простом случае, как этот (особенно когда вам нужен доступ к объекту), я бы с такой же вероятностью сделал это, как и для настройки задания cron.

Ответ №1:

Для такого рода задач вам следует использовать задание cron.

Я предлагаю вам использовать Whenever gem.

Смотрите railscast здесь:http://railscasts.com/episodes/164-cron-in-ruby

Комментарии:

1. Я смотрю railscast # 164, и Whenever gem выглядит неплохо. У вас много хорошего опыта работы с этим gem? Какие-либо недостатки, которые я должен рассмотреть?

2. Нет, это здорово и позволяет вам планировать все, что вам нужно, с надлежащей периодичностью

3. Это выглядит как отличная жемчужина. Спасибо за совет.

4. Вам действительно следует взглянуть на ответ Марселя, если вы обнаружите, что производительность становится проблемой, если у вас выполняется больше, чем, скажем, 10-20 задач с довольно короткими интервалами.

Ответ №2:

Поскольку вы уже используете Resque, я бы рекомендовал использовать один из многих доступных плагинов Resque: resque-scheduler. Также очень хорошо подключается к пользовательскому интерфейсу Resque. Простая настройка, как описано в README. Также добавляется много недостающих элементов DelayedJob (отложенное выполнение).

Почему я переключился с whenever на resque-scheduler :

  • Остается в папке приложения и не вмешивается в ваш cron-файл.
  • Чтобы остановить все ‘cron’, просто отключите Resque workers.
  • Исключения регистрируются в пользовательском интерфейсе Resque.
  • Возможно перепланирование вручную через пользовательский интерфейс Resque.
  • В сочетании с resque-loner вы предотвращаете двойное выполнение, если задание занимает больше времени, чем промежуток между двумя исполнениями.
  • По-прежнему подчиняется системе приоритетов Resque.
  • Нет дополнительного времени загрузки (может занять до 60 секунд, если ваше приложение станет больше), поскольку оно использует рабочий пул Resque.
  • На одну используемую «технологию» меньше.
  • Простой переключатель: Настройка выполняется в cron-подобном порядке.

Комментарии:

1. 1, потому что, похоже, это не повлечет за собой время запуска среды для выполнения рейк-теста каждые 5 минут и т.д. Для нас это большая победа, учитывая множество фоновых задач.

Ответ №3:

вы можете легко использовать всякий раз, когда он точно выполняет то, что вы просили, и многое другое, у него довольно хорошая документация.

вы можете использовать некоторый синтаксис, подобный этому:

 every 3.hours do
    runner "MyModel.some_process"
    rake "my:rake:task"
    command "/usr/bin/my_great_command"
end
  

установите его с помощью:

 $ gem install whenever
  

или добавьте его в свой GemFile:

 gem 'whenever', :require => false
  

затем запустите:

 $ cd /apps/my-great-project
$ wheneverize .
  

надеюсь, это поможет вам!