素泊まり()良いアイデアのメインループの仕事スケジューリングアプリ

StackOverflow https://stackoverflow.com/questions/1179301

質問

書いるジョブスケジューリングアプリRubyのための私の仕事は主として移動ファイルアクセスを含む様々なプロトコルを一定の周波数)

私の主なループようになります:

while true do
  # some code to launch the proper job
  sleep CONFIG["interval"]
end

このような魅力は、なんだ場合でも安心してアプリケーションが実行をサーバーとcpu-集中型のソフトウェアます。

しおりを付けることができるのと同じことを行ない、または sleep() するのに十分安全であるにも自分かるでしょうか?

役に立ちましたか?

解決

を用い寝はOK素早く汚れています。が必要とするも少性や信頼性を出していくことができることを悪の問題で寝るのは、スレッドのがんと窓はこちら---)は本当に眠のスケジューラ実行されませんのスレッドまでの時間後の睡眠間が経過しました。

この間は、スレッドがない目覚めのためのものです。この取り消しはできませんので、目覚める過程で何らかのイベントです。もちろん、プロセス殺され、そのなの睡眠のスレッドの機会と目を覚まし、クリーンもの。

私は知らないルビーが、思いのための施設で待機中複数のとなる。できれば、その代わりに睡眠頂waintする必要がありました。\

  1. タイマーが目を覚のスレッドを定期的にいくつかある。
  2. イベントに設定されたプロセスを取り消しや解除く(トラップ制御-Cなど)を行います。

でも、より良いものがある場合、もっといろんなイベントに使用できる信号のに必要なのです。このようなポーリングに始まります。この一般的に低くの資源利用と対応システム。

他のヒント

私はブロックする必要性を感じるときはいつでも、私はイベントループを使用します。通常libevは。ここで結合ルビーです。

http://rev.rubyforge.org/rdoc/する

あなたのプロセスがバックグラウンドで起こって何かをせずにスリープ状態にしたい場合は、

基本的には、sleepは完全に罰金です。あなたは睡眠のような、しかし、他のことをやるとまたTCP接続または読み出し可能になるためのファイルハンドルを待ちたい場合は、イベントループを使用する必要があるとしています。それでは、なぜちょうど先頭に1を使用していない?

あなたのアプリケーションの流れは次のようになります。

main {
   Timer->new( after => 0, every => 60 seconds, run => { <do your work> } )
   loop();
}
あなたが他のものをしたい場合は、

、あなただけのウォッチャを作成し、それはあなたのために起こります。 (あなたが実行しているジョブもウォッチャーを作成することができます。)

あなたは、正確な間隔を必要としない場合は、

、それは私には意味があります。あなたがドリフトせずに通常の倍で起こさする必要がある場合、あなたはおそらく、外部タイマーのいくつかの種類を使用します。あなたが眠っているときしかし、あなたはCPUリソースを使用していません。それは高価だタスクスイッチです。

それは寝ている間、それは文句を言わないCPUを使用していますが、長い時間のために眠っている場合、私はそれが何もしていないしている間にメモリを保持する実行しているRubyインタプリタのより心配になります。これは、取引カントーの大きなではありません。

scroll top