3

我正在使用 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>'

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

4

3 回答 3

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]
...
于 2014-01-22T11:33:03.807 回答
3

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

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

scheduler.every '10', &job

编辑:在未来的版本中,您将能够:

scheduler.every '10', first: :now
于 2014-01-22T11:01:20.957 回答
0

您可以执行以下操作:

scheduler.every '10s', first_in: 1.second.since do
  # ...
end
于 2014-01-22T11:04:21.310 回答