#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 .
надеюсь, это поможет вам!