2014-01-22 159 views
3

我正在使用rufus調度程序來執行每個經常執行的任務。我希望所有的任務都能在腳本啓動時立即運行,然後以給定的時間間隔運行。這似乎不被API支持,或者我錯過了什麼?Rufus調度程序:立即運行,每x秒運行一次

我使出指定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>' 

任何想法是什麼正確的方法是做到這一點?

回答

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

Thx男子的解釋 –

+1

這不是我在我的測試中發現的。如果我指定0.1,則更接近立即執行。見我的結果,這是典型的: \t:first_in => 0.1 \t \t [:scheduled_at, 「57:00.010」] \t \t [:每個 「57:00.312」] \t \t [:單,「 57:05.426「] \t \t [:every,」57:10.544「] \t:first_in => 0。4 \t \t [:scheduled_at, 「57:22.108」] \t \t [:每個 「57:22.710」] \t \t [:每個 「57:27.828」] \t \t [:每個「,57: 32.944「] –

+1

非常好,幹得好! – jmettraux

3

您可以在一個進程包裝作業,並立即調用它的第一次:

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

scheduler.every '10', &job 

編輯:在future release你將能夠做到:

scheduler.every '10', first: :now 
+0

CF https://gist.github.com/jmettraux/8557346 – jmettraux

+0

哎呀,我應該得到的分;-) – jmettraux

+0

這似乎是做到這一點的唯一方法,但它感覺不到正確的方式。我認爲答案的確是目前API不支持這種行爲。也許我應該添加它並提交一個請求... –

0

你可以做以下:

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

請注意,這僅在使用Rails時纔有效。否則它會拋出'NoMethodError:1:Fixnum'的未定義方法'秒'。 – Agis

+1

這將在第一次* 1秒*之後運行,而不是*立即*。 – Agis

+1

絕對正確 –