如何创建将产生多个工作者的守护进程



我有一个名为'worker.rb'的脚本。当运行这个脚本将执行处理一段时间(假设一个小时),然后结束。

我需要有另一个脚本,它将负责生成上面的工人脚本。我们把这个脚本命名为"runner.rb"。"跑步者。Rb '将被调用,并带有一个参数,该参数规定了允许生成多少工作线程。

我喜欢跑步。做以下事情:"ruby跑步者。rb 5 ')-查询数据库的特定值(例如得到100个值)-刷出5个"工人"Rb '(分别传递前5个值)-继续检查'worker '的任何实例。Rb '在上面生成完成,然后调用'worker '。再次使用数据库中的第6个值Rb ',并无限地继续此过程。

我正在使用守护宝石,但我失去了最好的方式去做这件事。"运行程序"脚本应该被守护进程化——但是工作程序也应该被守护进程化吗?

'runner'应该如何检查'worker'是否已经完成?这可以使用存储在文件中的PID来完成吗?

我以前使用过Daemons gem。但不知何故,它在保持子进程数量方面做得不好。然后我创建了另一个,名为light_daemon。您可以让light_daemon预分叉一定数量的工作进程。如果一个worker因为任何原因死亡,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次后,工作进程死亡。然后生成一个新的工作进程并继续进程。

相关内容

  • 没有找到相关文章

最新更新