3

rufus スケジューラを使用して、いくつかのタスクを頻繁に実行しています。スクリプトが開始されるとすぐにすべてのタスクを多かれ少なかれ実行し、次に指定された間隔で実行したいと思います。これは API でサポートされていないようですが、何か不足していますか?

次のように、最初の実行までの遅延として0.1秒を指定することに頼りました

scheduler = Rufus::Scheduler.new

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

プロパティが 0 に設定されている場合:first_in、スケジューラは最初の実行前に 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 は毎秒 3 回起動するため、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 に答える