2016-06-29 16 views
1

私はすべて1分、特定のタスクを実行する必要があるRailsアプリケーション上のルビー実行しています:ルーファス・スケジューラの同時実行

scheduler.every '1m' do 
    ..... 
end 

をしかし、時には、仕事は作業を完了するために1分以上かかります。起こっているのは、彼が終わる前にルーファスが新しい仕事を始め、それが終わる前に前の仕事を "殺す"ということです。 ルーファスが次の仕事を開始する前に仕事の終了を期待する方法はありますか?

Psの:まだ開発中なので、私はあなたがあなたの仕事のためにファイルロックのチェックを追加することができますWEBrickに

+1

hm。私はRufusに精通していませんが、私は多くのスケジューリングを行っています。代わりにインターバルジョブを実行することがあります。 Rufusのドキュメンテーションから:「すべての仕事は10分ごとのようなものですが、これをやってください」という言葉は10分待ってからもう一度やり直してください。そのうちの1つをスケジュールし、それが完了するのを待ってから、1m(またはあなたの間隔が何であれ)で再びスケジュールを立てます。 –

答えて

0

を使用しています。本当に簡単にできる宝石があります:https://github.com/cph/single_file

基本的には、タスクをSingleFileブロックにラップすることができ、最初のタスクは一時ファイルにロックをかけます。再度実行するようにスケジュールされている場合、前のタスクにまだファイルにロックが設定されている(実行されていない)場合、タスクはその時間に実行されません。

include SingleFile 

scheduler.every '1m' do 
    with_file_lock("/tmp/magic_is_happening.lock") do 
    MagicClass.poof! 
    end 
end 
0

コメントの形でのChristopher Daviesの応答は非常に良好です。彼は「インターバル」ジョブを指しています。

https://github.com/jmettraux/rufus-scheduler#in-at-every-interval-cron

あなたは、このようにルーファス・スケジューラは各実行の間に1分であなたのブロックを実行できるように

scheduler.interval '1m' do 
    # ... 
end 

を行うことができます。あなたはドキュメントのさらに下を掘る場合

、暴露別の技術がある:

https://github.com/jmettraux/rufus-scheduler#overlap--false

scheduler.every '1m', overlap: false do 
    # ... 
end 

スケジューラは毎分をチェックします。ブロックがまだ実行されていない場合はブロックが実行され、ブロックが実行されている場合はトリガーされず、1分後に戻り、再びチェックされます。

あなたのニーズに合った手法を選んでください。

関連する問題