#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 раз. Затем создается новый рабочий процесс, и процесс продолжается.