Ruby Как создать процесс демона, который будет порождать несколько рабочих
У меня есть скрипт с именем 'worker.rb'. При запуске этот скрипт будет некоторое время обрабатывать (скажем, час), а затем умрет.
Мне нужно иметь другой скрипт, который будет отвечать за порождение рабочего скрипта выше. Давайте назовем этот скрипт runner.rb. 'runner.rb' будет вызываться с аргументом, определяющим, сколько рабочих разрешено создавать.
Я бы хотел, чтобы runner.rb делал следующее: (например, 'ruby runner.rb 5') - запрашивал у базы данных конкретные значения (например, получил 100 значений) - порождал 5 экземпляров 'worker.rb' (передавая первые 5 значения соответственно) - продолжайте проверять любой из экземпляров 'worker.rb', созданных выше, чтобы завершить его, а затем снова вызвать 'worker.rb' с шестым значением из базы данных и продолжать этот процесс бесконечно.
Я использую драгоценный камень Демонов, но теряюсь как лучший способ сделать это. Сценарий 'runner' должен быть определенно демонизирован, но должен ли демон также работать?
Как "бегун" должен проверять, закончил ли "работник" или нет? Можно ли это сделать с помощью PID, хранящегося в файле?
1 ответ
Я использовал драгоценный камень Демонов раньше. Но почему-то это не помогло сохранить количество дочерних процессов. Затем я сделал еще один, называется light_daemon. Вы можете позволить light_daemon предварительно обработать определенное количество рабочих процессов. Если один из работников умрет по какой-либо причине, light_daemon создаст нового, чтобы заменить его. Если ваш рабочий процесс может вызвать утечку памяти, вы можете позволить работе умереть до того, как она станет слишком большой. Родительский процесс будет сохранять число рабочих процессов постоянным. Я использовал его на сайте одного из моих проектов. Я работал довольно хорошо.
Ниже приведен пример демона, использующего гем light-daemon.
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" )
В демоне рабочий процесс умирает после 100-кратного вызова метода "call". Затем создается новый рабочий процесс, и процесс продолжается.