Ruby Как создать процесс демона, который будет порождать несколько рабочих - PullRequest
1 голос
/ 12 ноября 2011

У меня есть скрипт с именем 'worker.rb'.Когда этот скрипт запускается, он некоторое время выполняет обработку (скажем, час), а затем умирает.

Мне нужен еще один скрипт, который будет отвечать за порождение рабочего скрипта выше.Давайте назовем этот скрипт runner.rb.'runner.rb' будет вызываться с аргументом, определяющим, сколько рабочих ему разрешено создавать.

Я бы хотел, чтобы runner.rb делал следующее: (например, 'ruby runner.rb 5') - запрашивал у базы данных определенные значения (например, получил 100 значений) - порождал 5 экземпляров 'worker.rb'(передавая первые 5 значений соответственно) - продолжайте проверять, чтобы любой из экземпляров' worker.rb ', созданных выше, завершился, а затем снова вызовите' worker.rb 'с 6-м значением из базы данных и продолжайте этот процесс бесконечно.

Я использую драгоценный камень Демонов, но теряюсь как лучший способ сделать это.Сценарий 'runner' определенно должен быть демонизирован, но должен ли демон также работать?

Как «бегун» должен проверять, закончил ли «работник» или нет?Можно ли это сделать с помощью PID, хранящегося в файле?

1 Ответ

0 голосов
/ 22 ноября 2012

Я использовал драгоценный камень Демонов раньше. Но почему-то это не помогло сохранить количество дочерних процессов. Затем я сделал еще один, который называется 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" )

В демоне рабочий процесс умирает после 100-кратного вызова метода "call". Затем создается новый рабочий процесс, и процесс продолжается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...