Rufus Scheduler:立即第一次运行每隔x秒运行一次

时间:2014-01-22 10:52:44

标签: ruby rufus-scheduler

我正在使用rufus调度程序来执行某些任务。我希望在脚本启动时,或者在给定的时间间隔内,所有任务都会立即运行。这似乎没有API支持,或者我错过了什么?

我已经指定0.1秒作为第一次运行的延迟,如下所示

scheduler = Rufus::Scheduler.new

scheduler.every '10s', :first_in => 0.1 do
    #do some work
end 

如果:first_in属性设置为0,则调度程序会在第一次运行之前等待整整10秒。如果该值设置得太低(我想在过去执行任务时评估的内容),或者如果我使用Time.now,则会引发以下错误:

~/.ruby/gems/rufus-scheduler-3.0.4/lib/rufus/scheduler/jobs.rb:383:in `first_at=': cannot set first[_at|_in] in the past: 1.0e-07 -> 2014-01-22 10:44:32 +0000 (ArgumentError)
    from ~/.ruby/gems/rufus-scheduler-3.0.4/lib/rufus/scheduler/jobs.rb:445:in `first_at='
    from ~/.ruby/gems/rufus-scheduler-3.0.4/lib/rufus/scheduler/jobs.rb:370:in `initialize'
    from ~/.ruby/gems/rufus-scheduler-3.0.4/lib/rufus/scheduler/jobs.rb:457:in `initialize'
    from ~/.ruby/gems/rufus-scheduler-3.0.4/lib/rufus/scheduler.rb:570:in `new'
    from ~/.ruby/gems/rufus-scheduler-3.0.4/lib/rufus/scheduler.rb:570:in `do_schedule'
    from ~/.ruby/gems/rufus-scheduler-3.0.4/lib/rufus/scheduler.rb:207:in `every'
    from rufus_runner.rb:11:in `<main>'

知道正确的方法是做什么的吗?

3 个答案:

答案 0 :(得分:6)

皮埃尔 - 路易斯很接近:

require 'rufus-scheduler'

s = Rufus::Scheduler.new

p [ :scheduled_at, Time.now ]

s.every '5s', :first_in => 0.4 do
  p [ :every,  Time.now ]
end

s.join

Rufus-scheduler默认情况下每秒唤醒三次,因此0.4是一个很好的近似值。

这会发出:

[:scheduled_at, Wed Jan 22 20:30:55 +0900 2014]
[:every, Wed Jan 22 20:30:56 +0900 2014]
[:every, Wed Jan 22 20:31:01 +0900 2014]
[:every, Wed Jan 22 20:31:06 +0900 2014]
[:every, Wed Jan 22 20:31:11 +0900 2014]
...

答案 1 :(得分:3)

您可以将作业包装在proc中并在第一次立即调用它:

job = Proc.new do
  # do some work
end.call

scheduler.every '10', &job

编辑:在future release中你可以做到:

scheduler.every '10', first: :now

答案 2 :(得分:0)

您可以执行以下操作:

scheduler.every '10s', first_in: 1.second.since do
  # ...
end