素泊まり()良いアイデアのメインループの仕事スケジューリングアプリ
-
19-09-2019 - |
質問
書いるジョブスケジューリングアプリRubyのための私の仕事は主として移動ファイルアクセスを含む様々なプロトコルを一定の周波数)
私の主なループようになります:
while true do
# some code to launch the proper job
sleep CONFIG["interval"]
end
このような魅力は、なんだ場合でも安心してアプリケーションが実行をサーバーとcpu-集中型のソフトウェアます。
しおりを付けることができるのと同じことを行ない、または sleep()
するのに十分安全であるにも自分かるでしょうか?
解決
を用い寝はOK素早く汚れています。が必要とするも少性や信頼性を出していくことができることを悪の問題で寝るのは、スレッドのがんと窓はこちら---)は本当に眠のスケジューラ実行されませんのスレッドまでの時間後の睡眠間が経過しました。
この間は、スレッドがない目覚めのためのものです。この取り消しはできませんので、目覚める過程で何らかのイベントです。もちろん、プロセス殺され、そのなの睡眠のスレッドの機会と目を覚まし、クリーンもの。
私は知らないルビーが、思いのための施設で待機中複数のとなる。できれば、その代わりに睡眠頂waintする必要がありました。\
- タイマーが目を覚のスレッドを定期的にいくつかある。
- イベントに設定されたプロセスを取り消しや解除く(トラップ制御-Cなど)を行います。
でも、より良いものがある場合、もっといろんなイベントに使用できる信号のに必要なのです。このようなポーリングに始まります。この一般的に低くの資源利用と対応システム。
他のヒント
私はブロックする必要性を感じるときはいつでも、私はイベントループを使用します。通常libevは。ここで結合ルビーです。
http://rev.rubyforge.org/rdoc/する
あなたのプロセスがバックグラウンドで起こって何かをせずにスリープ状態にしたい場合は、基本的には、sleep
は完全に罰金です。あなたは睡眠のような、しかし、他のことをやるとまたTCP接続または読み出し可能になるためのファイルハンドルを待ちたい場合は、イベントループを使用する必要があるとしています。それでは、なぜちょうど先頭に1を使用していない?
あなたのアプリケーションの流れは次のようになります。
main {
Timer->new( after => 0, every => 60 seconds, run => { <do your work> } )
loop();
}
あなたが他のものをしたい場合は、、あなただけのウォッチャを作成し、それはあなたのために起こります。 (あなたが実行しているジョブもウォッチャーを作成することができます。)
、それは私には意味があります。あなたがドリフトせずに通常の倍で起こさする必要がある場合、あなたはおそらく、外部タイマーのいくつかの種類を使用します。あなたが眠っているときしかし、あなたはCPUリソースを使用していません。それは高価だタスクスイッチです。
sleep(timeout)
は、いくつかの設計のために完全に適切ですが、心に留めするための1つの重要な注意点があります。
のことを考えてみましょう...
#! /usr/bin/ruby
Signal.trap("USR1") { puts "Hey, wake up!" }
Process.fork() { sleep 2 and Process.kill("USR1", Process.ppid) }
sleep 30
puts "Zzz. I enjoyed my nap."
...というよりも、2、実行するのに約30秒かかります。
この問題を回避するには、代わりに睡眠中断でしょう、あなたのシグナルハンドラで例外がスローされることがあります(または何か他のものを!)上記。あなたはまた、/ <select
ベースのループに切り替えて、自己パイプのトリックのバリアントを使用する場合がありますA>信号を受けて、「早く」目を覚まします。他の人が指摘したように、完全な機能を備えたイベントライブラリも用意されています。
それは寝ている間、それは文句を言わないCPUを使用していますが、長い時間のために眠っている場合、私はそれが何もしていないしている間にメモリを保持する実行しているRubyインタプリタのより心配になります。これは、取引カントーの大きなではありません。