我正在使用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>'
知道正确的方法是做什么的吗?
答案 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