1

我有一个名为“worker.rb”的脚本。运行时,此脚本将执行一段时间(可以说是一个小时)然后死掉。

我需要另一个脚本来负责生成上面的工作脚本。我们称这个脚本为“runner.rb”。'runner.rb' 将被调用,并带有一个参数,该参数指示允许生成多少个工人。

我希望 runner.rb 执行以下操作:(例如 'ruby runner.rb 5')- 查询数据库中的特定值(例如获得 100 个值)- 生成 5 个 'worker.rb' 实例(传递前 5 个)值) - 继续检查上面生成的任何“worker.rb”实例是否完成,然后使用数据库中的第 6 个值再次调用“worker.rb”并无限期地继续此过程。

我正在使用 Daemons gem,但作为解决此问题的最佳方式而迷失了方向。'runner' 脚本绝对应该被守护 - 但工人也应该被守护吗?

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

4

1 回答 1

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 次后死亡。然后产生一个新的工作进程并继续该进程。

于 2012-11-22T07:49:11.730 回答