1

「worker.rb」というスクリプトがあります。このスクリプトを実行すると、しばらく (たとえば 1 時間) 処理が実行されてから終了します。

上記のワーカー スクリプトの生成を担当する別のスクリプトが必要です。このスクリプトを「runner.rb」と呼びましょう。「runner.rb」は、スポーンできるワーカーの数を指定する引数で呼び出されます。

runner.rb に次のことを実行してもらいたい: (例: 'ruby runner.rb 5') - データベースに特定の値を照会する (例: 100 個の値を取得する) - 'worker.rb' の 5 つのインスタンスを生成する (最初の 5 つの値を渡す)それぞれの値) - 上記で生成された「worker.rb」のインスタンスのいずれかをチェックして終了し、データベースから 6 番目の値を使用して「worker.rb」を再度呼び出し、このプロセスを無期限に続行します。

私はデーモンの宝石を使用していますが、これを行う最善の方法として迷っています。「ランナー」スクリプトは必ずデーモン化する必要がありますが、ワーカーもデーモン化する必要がありますか?

「ランナー」は「ワーカー」が終了したかどうかをどのように確認する必要がありますか? これは、ファイルに保存されている PID を使用して実行できますか?

4

1 に答える 1

0

以前は Daemons gem を使用していました。しかし、どういうわけか、子プロセスの数を維持することはうまくいきませんでした。次に、 light_daemonという名前の別のものを作成しました。light_daemon に特定の数のワーカー プロセスをプリフォークさせることができます。ワーカーの 1 つが何らかの理由で死亡した場合、light_daemon は新しいワーカーを生成して置き換えます。ワーカー プロセスがメモリ リークの問題を引き起こす可能性がある場合は、作業が大きくなりすぎる前にアクティブに終了させることができます。親プロセスは、ワーカー プロセスの数を一定に保ちます。私は自分のプロジェクトの 1 つのプロデュース サイトでそれを使用しました。私はかなりよく働きました。

以下は、light-daemon gem を使用したデーモンの例です。

require 'rubygems'
require 'light_daemon'

class Client
  def initialize
    @count = 0
  end

  def call
    `echo "process: #{Process.pid}" >> /tmp/light-daemon.txt`
    sleep 3
    @count +=1
    (@count < 100)? true : false
  end
end

LightDaemon::Daemon.start(Client.new, :children=> 2, :pid_file => "/tmp/light-daemon.pid" )

デーモンでは、メソッド「call」が 100 回呼び出されると、ワーカー プロセスが終了します。次に、新しいワーカー プロセスが生成され、プロセスが続行されます。

于 2012-11-22T07:49:11.730 に答える