Ruby如何创建将生成多个worker的守护进程

时间:2011-11-12 19:50:23

标签: ruby-on-rails ruby ruby-daemons

我有一个名为'worker.rb'的脚本。运行时,此脚本将执行一段时间的处理(一小时可以说),然后死亡。

我需要另一个脚本来负责产生上面的worker脚本。我们称这个脚本为'runner.rb'。 'runner.rb'将通过一个参数来调用,该参数指示允许产生多少工人。

我想让runner.rb做以下事情:(例如'ruby runner.rb 5')   - 在数据库中查询特定值(例如,获得100个值)   - 产生5个'worker.rb'实例(分别传递前5个值)   - 继续检查上面生成的'worker.rb'的任何实例,然后再次使用数据库中的第6个值调用'worker.rb',并无限期地继续此过程。

我正在使用守护进程的宝石,但我失去了最好的方法来解决这个问题。 “跑步者”脚本肯定应该被守护 - 但工作人员是否也应该被守护?

'跑步者'应该如何检查“工人”是否已经完成?可以使用存储在文件中的PID来完成吗?

1 个答案:

答案 0 :(得分:0)

之前我使用过Daemons gem。但不知何故,它在保持子进程数量方面表现不佳。然后我做了另一个,叫做light_daemon。您可以让light_daemon预先执行一定数量的工作进程。如果其中一个工人因任何原因死亡,light_daemon将生成一个新的替换它。如果您的工作进程可能导致内存泄漏问题,您可以让工作在它变得太大之前主动死亡。父进程将保持工作进程的数量不变。我在我的一个项目的生产现场使用它。我工作得很好。

以下是使用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次后死亡。然后生成一个新的工作进程,并继续该过程。