【问题标题】:How to run a cron job every 10 seconds in ruby on rails如何在 ruby​​ on rails 中每 10 秒运行一次 cron 作业
【发布时间】:2019-07-10 09:37:48
【问题描述】:

我试图每 10 秒运行一次运行一段代码的 cron 作业。我使用了一种需要运行代码并使其休眠 10 秒的方法,但这似乎会大大降低应用程序的性能。我正在使用 gem,它每分钟运行一次并休眠 10 秒。如何使用 sleep 方法实现相同的 w/o。以下是我的代码。

every 1.minute do
  runner "DailyNotificationChecker.send_notifications"
end

class DailyNotificationChecker
    def self.send_notifications
        puts "Triggered send_notifications"
        expiry_time = Time.now + 57
        while (Time.now < expiry_time)
            if RUN_SCHEDULER == "true" || RUN_SCHEDULER == true
              process_notes
            end
          sleep 10 #seconds
        end

    def self.process_notes
        notes = nil
        time = Benchmark.measure do
          Note.uncached do
            notes = Note.where(status: false)
            notes.update_all(status: true)
          end
        end
        puts "time #{time}"
      end
    end

我的代码的目标是将对象的布尔状态更改为 true,每 10 秒检查一次。该表有 200 万条记录。

【问题讨论】:

  • 听起来您需要在后台运行一个守护进程,而不是每 10 秒启动一次 cronjob。我不确定你为什么不想要sleep,但我认为每 10 秒启动一个新进程并不比睡眠一段时间更好(它必须每 10 秒启动整个 rails 应用程序!!)。

标签: ruby-on-rails ruby ruby-on-rails-4 cron whenever


【解决方案1】:

我建议为此使用 Sidekiq 后台作业。使用sidekiq-scheduler gem,您可以在任何您需要的内部运行普通的 sidekiq 作业计划。拥有通过 Sidekiq gem 处理和监控作业的 Web 界面的奖励积分。

【讨论】:

  • 嗨斯派克曼。您拥有惊人的 stackoverflow 声誉。需要安装redis吗?在你看来,你能告诉我 sleep 命令是否对应用程序有不利影响吗?
  • 因为sidekiq的默认数据库是redis,这个解决方案需要安装redis。这对您的应用程序来说可能有点过头了,但根据我的经验,大多数应用程序迟早都需要后台处理。让一个进程或线程休眠 10 秒不会影响其他进程或线程。但它要求你让这个线程一直运行,尽管它大部分时间都在休眠。
【解决方案2】:

您将使用clockwork gem。它在一个单独的进程中运行。配置非常简单。

require 'clockwork'
include Clockwork

every(10.seconds, 'frequent.job') { DailyNotificationChecker.process_notes }

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 2011-03-20
    • 1970-01-01
    • 2015-07-29
    • 2021-12-18
    • 1970-01-01
    • 2018-03-22
    • 2021-06-17
    • 2015-03-23
    相关资源
    最近更新 更多