Ruby Как создать демонический процесс, который будет порождать несколько рабочих элементов

#ruby-on-rails #ruby #ruby-daemons

#ruby-on-rails #ruby #ruby-демоны

Вопрос:

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

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

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

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

Как ‘runner’ должен проверять, завершен ли ‘worker’ или нет? Можно ли это сделать, используя PID, хранящийся в файле?

Комментарии:

1. Вы делаете это на heroku?

Ответ №1:

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

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