我有一个名为'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次后,工作进程死亡。然后生成一个新的工作进程并继续进程。