2011-02-07 3 views
1

Я создал демон в Ruby, который имеет счетчик, увеличивающий внутри цикла. Цикл выполняет свою деятельность, затем спит в течение 1 секунды, затем продолжается. Упрощенно это что-то вроде:Каков наилучший способ периодического экспорта счетчика из цикла в Ruby

loop do 
    response = send_command 
    if response == 1 
    counter += 1 
    end 
    sleep(1) 
end 

Каждые 5 минут я хотел бы вызвать метод в базу данных значение счетчика. Я считаю, что есть несколько способов сделать это. Первоначальный способ, который я рассматривал, заключался в вызове Time.now в цикле, рассматривая его, чтобы он соответствовал 5 минутам, 0 секундам, и если это согласовано, вызовите функцию sql. Однако это кажется ужасно неэффективным, и он также может пропустить запись, если send_command заняло некоторое время.

Другой возможностью может быть предоставление переменной счетчика, которая может быть вызвана (и сброшена) через сокет. Я кратко взглянул на класс Socket, и это кажется возможным.

Есть ли очевидный/лучший способ сделать это, что мне не хватает?

ответ

1

Если вы хотите сохранить только каждые 5 минут, вы можете просто использовать Thread. Что-то вроде:

Thread.new do 
    save_value_in_the_db(counter) 
    sleep 5*60 
end 

Обратите внимание, что поток имеет доступ к счетчику, если он определен в том же блоке, что и цикл. вы также можете использовать объект и указать @counter insidd.

Если вы предпочитаете доступ удаленно, вы можете сделать это с помощью сокета или использовать подход drb, что, вероятно, проще. Этот учебник drb, похоже, соответствует вашим требованиям: http://ruby.about.com/od/advancedruby/a/drb.htm

+0

К сожалению, мне нужно обновлять счетчик чаще, чем каждые 5 минут. Это цифровое чтение, изменяющееся от 0 до 1 - мне приходится подсчитывать изменения, и многие могут произойти в сегменте за 5 минут. Я сделал немного drb, это просто казалось более чем необходимо. – markf

+0

Извините, я неправильно понял ваш ответ. Это тоже достойный вариант - и я подумаю. – markf

+0

Это то, что я сделал. Я стал глобальным на счетчике (-ах) и создал два потока - один для сбора данных и один для базы данных. Спасибо за помощь. – markf

0

У меня будет счетчик обновляться каждый раз через цикл, а затем периодически что-то читать и обновлять базу данных.

Это делает более простой основной цикл, потому что ему не нужно обращать внимание на то, сколько времени нужно ждать, прежде чем экспортировать значение.

И очень часто и нормально иметь периодическую задачу, которая отображает значение и что-то делает с ним.

Создание простого сокета будет работать хорошо. Код Ruby's Socket В RDoc есть несколько образцов для эхо-серверов, которые могут вас запустить.

+0

Да, я думаю, именно там я и собирался идти. Я просто не знал, есть ли более простой способ сделать это. Возможно, я смогу также разделить мои другие мониторы и разгрузить базу данных в одно приложение. Спасибо за подтверждение. – markf

Смежные вопросы