当从一个可能很慢的网站读取数据时,我想确保get_response无法挂起,因此在x秒后添加了一个超时计时器。到现在为止还挺好。然后我读了http://ph7spot.com/musings/system-timer,这说明在某些情况下,由于ruby的线程实现,timer.rb不起作用。
有谁知道这是否是这些情况之一?
url = URI.parse(someurl)
begin
Timeout::timeout(30) do
response = Net::HTTP.get_response(url)
@responseValue = CGI.unescape(response.body)
end
rescue Exception => e
dosomething
end
答案 0 :(得分:0)
好吧,首先,Timeout不是在Rails中定义的类,而是在Ruby中,其次,Timeout在进行系统调用时不可靠。
Ruby使用它所谓的绿色线程。假设你有3个线程,你认为它们都将并行运行,但是如果其中一个线程发出系统调用,则所有其余线程都将被阻塞,直到系统调用完成,在这种情况下,Timeout将无法按预期工作,所以使用像SystemTimer这样可靠的东西总是更好。