Использование тайм-аута ruby ​​в потоке, выполняющем вызов базы данных

Я использую Ruby 1.9.2.

У меня запущен поток, который периодически обращается к базе данных. Звонки могут быть довольно долгими, а иногда (по разным причинам) пропадает соединение с БД. Если он все-таки исчезнет, ​​поток просто молча висит там навсегда.

Итак, я хочу обернуть все это таймаутом, чтобы справиться с этим. Проблема в том, что во второй раз, когда должен быть вызван тайм-аут (всегда второй), он все равно просто зависает. Тайм-аут никогда не вступает в силу. Я знаю, что эта проблема существовала в 1.8, но мне казалось, что timeout.rb работал в 1.9.

t = Thread.new do
  while true do
    sleep SLEEPTIME
    begin
      Timeout::timeout(TIMEOUTTIME) do
        puts "About to do DB stuff, it will hang here on the second timeout"
        db.do_db_stuff()
        process_db_stuff()
      end
    rescue Timeout::Error
      puts "Timed out"
      #handle stuff here
    end
  end
end

Есть идеи, почему это происходит и что я могу с этим поделать?

5
задан Hsiu Dai 4 October 2011 в 17:39
поделиться