Какой-то рубиновый "прерыватель" - PullRequest
3 голосов
/ 19 октября 2010

Итак, вот что я делаю - у меня есть скрипт ruby, который печатает информацию каждую минуту.Я также настроил процедуру для ловушки, чтобы, когда пользователь нажимал Ctrl-C, процесс прерывался.Код выглядит примерно так:

switch = true

Signal.trap("SIGINT") do
    switch = false
end

lastTime = Time.now

while switch do
    if Time.now.min > lastTime.min then
        puts "A minute has gone by!"
    end
end

Теперь сам код корректен и работает хорошо, но он выполняет много бесполезной работы, проверяя значение switch настолько часто, насколько это возможно.Он использует столько процессора, сколько может (как минимум, 100% одного ядра), так что это довольно расточительно.Как я могу сделать что-то похожее на это, когда событие обновляется так часто, не тратя тонны циклов?

Вся помощь приветствуется и спасибо заранее!

Ответы [ 2 ]

7 голосов
/ 19 октября 2010

У вас есть несколько решений. Одним из них является использование Thread :: Queue, если вы ожидаете много сигналов и хотите, например, обрабатывать каждый из них как событие. Если вы действительно ждете, пока не произойдет ^ C без сложных взаимодействий с другими потоками, я думаю, что может быть просто использовать Thread # wakeup:

c = Thread.current

Signal.trap("SIGINT") do
  c.wakeup
end

while true
  sleep
  puts "wake"
end
4 голосов
/ 19 октября 2010

Если вы просто перехватываете прерывания ctrl-c и не возражаете против короткого ожидания между нажатием клавиш и его прерыванием, то ...

switch = true

Signal.trap("SIGINT") do
    switch = false
end

lastTime = Time.now

while switch do
    sleep 1
    if Time.now.min > lastTime.min then
        puts "A minute has gone by!"
    end
end

Функция «сна» использует системные таймеры, поэтому не использует процессор во время ожидания.Если вам нужно более точное разрешение, просто замените sleep 1 на sleep 0.5 или даже меньше, чтобы сократить время между проверками,

...