Таймер в исполнении Ruby - PullRequest
       3

Таймер в исполнении Ruby

5 голосов
/ 17 февраля 2010

Я искал онлайн-пример, демонстрирующий таймер в ruby, и наткнулся на код ниже. Он работает, как и ожидалось, но имеет ли смысл, что эта простая программа использует 30Mo памяти (как показано в диспетчере задач Windows) и слишком много CPU?

Большое спасибо

def time_block
  start_time = Time.now
  Thread.new { yield }
  Time.now - start_time
end

def repeat_every(seconds)
  while true do
    time_spent = time_block { yield } # To handle -ve sleep interaval
    sleep(seconds - time_spent) if time_spent < seconds
  end
end

repeat_every(5) {
}

1 Ответ

11 голосов
/ 17 февраля 2010

Как отмечается в комментариях к вопросу, все, что нужно для его работы, - это то, что вы присоединяетесь к ветке:

#!/usr/bin/ruby1.8

def repeat_every(interval, &block)
  loop do
    start_time = Time.now
    Thread.new(&block).join
    elapsed = Time.now - start_time
    sleep([interval - elapsed, 0].max)
  end
end

repeat_every(5) do
  puts Time.now.to_i
end

# => 1266437822
# => 1266437827
# => 1266437832
...

Тем не менее, в данном случае нет причин использовать потоки для кода в вопросе:

def repeat_every(interval)
  loop do
    start_time = Time.now
    yield
    elapsed = Time.now - start_time
    sleep([interval - elapsed, 0].max)
  end
end

repeat_every(5) do
  puts Time.now.to_i
end

# => 1266437911
# => 1266437916
# => 1266437921

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

def repeat_every(interval)
  Thread.new do
    loop do
      start_time = Time.now
      yield
      elapsed = Time.now - start_time
      sleep([interval - elapsed, 0].max)
    end
  end
end

thread = repeat_every(5) do
  puts Time.now.to_i
end  
puts "Doing other stuff..."
thread.join

# => 1266438037
# => Doing other stuff...
# => 1266438042
# => 1266438047
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...