【问题标题】:rufus-scheduler concurrencyrufus-调度器并发
【发布时间】:2016-06-29 17:05:10
【问题描述】:

我正在运行一个 ruby​​ on rails 应用程序,它需要每分钟执行一次特定任务:

scheduler.every '1m' do
   .....
end

但有时,完成这项工作需要超过 1 分钟的时间。正在发生的事情是,在他完成之前,Rufus 开始了一项新工作,这在它结束之前“杀死”了之前的工作。 有什么办法可以让 Rufus 在开始下一项工作之前完成这项工作?

Ps.:仍在开发中,所以我正在使用 Webrick

【问题讨论】:

  • 嗯。我对 Rufus 不熟悉,但我做了很多调度。你可能会考虑做一个间隔工作。来自 Rufus 的文档:Whereas "every" jobs are like "every 10 minutes, do this", interval jobs are like "do that, then wait for 10 minutes, then do that again, and so on" 基本上,如果您安排其中一个,它将等待其完成,然后在 1m(或任何您的间隔)内再次安排。

标签: ruby-on-rails ruby rufus-scheduler


【解决方案1】:

您可以为您的任务添加文件锁定检查。有一个宝石让它变得非常简单:https://github.com/cph/single_file

基本上,您可以将任务包装在 SingleFile 块中,第一个任务将锁定临时文件。当它计划再次运行时,如果前一个任务仍然在文件上放置了锁(它没有完成运行),那么该任务将不会运行那个时间。

include SingleFile

scheduler.every '1m' do
  with_file_lock("/tmp/magic_is_happening.lock") do
    MagicClass.poof!
  end
end

【讨论】:

    【解决方案2】:

    Christopher Davies 以评论的形式做出的回应非常好。他指出了“间隔”工作。

    https://github.com/jmettraux/rufus-scheduler#in-at-every-interval-cron

    你可以这样做

    scheduler.interval '1m' do
      # ...
    end
    

    让 rufus-scheduler 在每次运行之间间隔 1 分钟运行您的块。

    如果您进一步深入研究文档,则会发现另一种技术:

    https://github.com/jmettraux/rufus-scheduler#overlap--false

    scheduler.every '1m', overlap: false do
      # ...
    end
    

    调度程序将每分钟检查一次。如果块还没有运行,它会运行它,如果它正在运行它不会触发,它会在一分钟后返回并再次检查。

    选择适合您需要的技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2017-09-14
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2011-01-13
      相关资源
      最近更新 更多