Rufus Scheduler vs Loop со сном - PullRequest
       41

Rufus Scheduler vs Loop со сном

0 голосов
/ 04 июня 2018

Мне нужно запускать ActiveJob в моем приложении на Rails 5 как можно чаще.

До сих пор я использовал задание cron, которое было определено с помощью гема ever (раньше использовался Crono).

Этот подход загружает все приложение rails прежде, чем оно выполнит свою работу, а затем завершает работу и делает все заново.Я хочу избежать этого, и вместо этого у меня есть постоянный «сервис», который делает эту работу.

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

Итак, мой вопрос:

Существуют ли какие-либо значимые различия между этими двумя вариантами ниже:

# With Rufus
scheduler = Rufus::Scheduler.new
scheduler.every('1s') { puts 'hello' }
scheduler.join

# Without Rufus
loop { puts "hello" ; sleep 1 }

Обратите внимание, что любой из этих сценариев будетвыполняется с rails runner my_scheduler.rb в качестве док-контейнера, и любое решение должно гарантировать, что задание выполняется только один раз (никогда два параллельно).

1 Ответ

0 голосов
/ 05 июня 2018

Существуют различия.

Rufus-планировщик every будет пытаться запускаться каждые 1 с, поэтому при t0 + 1, t0 + 2, t0 + 3 и т. Д. Пока будет работать вариант "сна"в t0, t0 + wt1 + 1, t0 + wt1 + 1 + wt2 + 1, ... (где wtN = время работы для N-го вызова puts hello).

Rufus-планировщик every будетиспользуйте рабочие потоки rufus-scheduler, чтобы при наличии перекрытия (wt (Nb)> wt (Na)) Nb все равно возникал.Это поведение может быть изменено (см. параметры задания ).

Rufus-планировщик interval ближе к вашей опции сна:

scheduler.interval('1s') { puts 'hello' }

Устанавливает 1 секунду (или любой другой промежуток времени, который вы хотите) между каждым прогоном puts 'hello'.

Для простого цикла do-sleep я бы выбрал опцию sleep.Но если вам нужно больше, у rufus-scheduler есть cron, interval, every и опции настройки для них.И вы можете запланировать несколько заданий.

scheduler.cron('0 1 1 * *') do
  # every first of the month at 1am
  flush_archive
end
scheduler.cron('0 8,13,19 * * mon-fri') do
  # every weekday at 8am, 1pm, 7pm
  clean_dishes
end
scheduler.interval('1s') do
  puts 'hello'
end
...