2011-02-07 8 views
1

Rubyでループ内でカウンタをインクリメントするデーモンを作成しました。ループはビジネスを行い、その後1秒間スリープ状態になります。簡体字は次のようなものです:Rubyのループからカウンタを定期的にエクスポートする最も良い方法は何ですか

5分ごとにカウンタ値をデータベースに呼び出すメソッドを呼び出したいと思います。私はこれを行うにはいくつかの方法があると思います。私が考えた最初の方法は、ループ内でTime.nowを呼び出して、5分、0秒に一致するかどうかを調べ、一致した場合はsql関数を呼び出します。ただし、send_commandに時間がかかった場合は、レコードが欠落する可能性があります。

もう1つの可能性は、カウンター変数を使用可能にすることです。この変数は、ソケット経由で呼び出すことができます。私は簡単にSocketクラスを見て、それは可能と思われます。

これを行うための明白な/最善の方法はありますか?

答えて

1

5分ごとに保存したいだけなら、スレッドを使用できます。次のようなものがあります。

Thread.new do 
    save_value_in_the_db(counter) 
    sleep 5*60 
end 

ループと同じブロックにスレッドが定義されている場合、そのスレッドはカウンタにアクセスできます。オブジェクトを使用して@counterをinsiddと宣言することもできます。

遠隔からアクセスしたい場合は、ソケットを使用するか、drbアプローチを使用します。これはおそらく簡単です。このdrbチュートリアルはあなたの要求に合っているようです:http://ruby.about.com/od/advancedruby/a/drb.htm

+0

残念ながら、5分ごとより頻繁にカウンタを更新する必要があります。それは0から1に変化するデジタル読書です - 私は変化を数えなければなりません、5分のセグメントで多くが起こるかもしれません。私はいくつかのdrbをやったことがある、それはちょうど必要以上のように見えた。 – markf

+0

申し訳ありませんが、私はあなたの答えを誤解しました。これはまともな選択肢でもあります。 – markf

+0

これは私がやっていることです。私はカウンターでグローバルに行き、2つのスレッドを作成しました.1つはデータを収集し、もう1つはデータベースに収集しました。助けてくれてありがとう。 – markf

0

私は、ループのたびにカウンタを更新してから定期的に何かを読んでデータベースを更新しています。

これは、値をエクスポートする前に待機する必要がある時間に注意を払う必要がないため、メインループが簡単になります。

また、値をサンプリングして何かを実行する定期的なタスクを持つことは非常に一般的であり、通常のことです。

シンプルなソケットを作成するとうまくいくはずです。 RubyのSocketコードRDocには、エコーサーバのサンプルが用意されています。

+0

私はそれがとにかく行く予定の場所だと思います。もっと簡単な方法があるかどうかはわかりませんでした。私は他のモニターにもソケットをして、単一のアプリケーションにデータベースをオフロードすることができるかもしれません。確認していただきありがとうございます。 – markf

関連する問題