저는 Ruby 1.9.2를 사용하고 있습니다.데이터베이스 호출을하는 스레드에서 루비 타임 아웃 사용
정기적으로 데이터베이스를 호출하는 스레드가 있습니다. 호출은 꽤 길 수 있으며 DB 연결이 사라지는 (여러 가지 이유로) 경우가 있습니다. 그것이 사라지면, 그 쓰래드가 조용히 조용히 거기에 매달려 있습니다.
그래서이 문제를 처리하기 위해 시간 초과를 모두 감싸고 싶습니다. 문제는 타임 아웃을 호출해야하는 두 번째 시간 (항상 두 번째)에 여전히 간단하게 중단된다는 것입니다. 제한 시간은 적용되지 않습니다. 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
왜 이런 일이 일어나고 있는지, 내가 어떻게 할 수 있습니까?
그래서 Timeout :: Error가 발생하지 않습니다. 오류가 발생하고 있습니까? –
맞습니다. 아무 일도 일어나지 않으며, 바로 그 곳에서 멈추게됩니다. 적어도, 실행을 다시 선택하는 경우 어디에서 실행할지 결정하기 위해 과도한'puts '을 두는 것으로 결정했습니다. –
왜 던지기를하고 있을까요? 타임 아웃의 전체 시점은 주어진 블록이 너무 오래 실행되면 오류가 발생한다는 것입니다. datamapper와 mysql2를 직접 사용해 보았습니다. 자동으로 다시 연결하고 문제를 해결할 수 있기를 바랍니다.하지만 운이 없습니다. 세부 사항이 도움이된다면, 그것은'.query (...) '를 수행하는 mysql2 연결이라고 가정 해 봅시다. 어쨌든 그 곳에서 아무 것도 던지지 않으며, 그 밖의 일반적인'rescue' 절은 어떤 상황에서도 그것을 잡아 내야합니다. –