Каков наилучший способ периодически экспортировать счетчик из цикла в Ruby - PullRequest
1 голос
/ 07 февраля 2011

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

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

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 голосов
/ 07 февраля 2011

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

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

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

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

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