2010-03-11 37 views
0

从可能很慢的网站读取数据时,我想确保get_response无法挂起,因此在x秒后添加了超时计时器。到现在为止还挺好。然后我读http://ph7spot.com/musings/system-timer这说明在某些情况下timer.rb不工作,因为ruby的线程实现。使用Net :: HTTP时,Rail定时器是否可靠?

有谁知道这是否是这些情况之一?

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

不知何故,我的代码示例被消除了。 – Frank 2010-03-11 20:08:26

+0

为你修复它。所有代码都需要缩进4(4)个空格。 – 2010-03-11 21:04:12

+0

红宝石约定到2(两个)空格缩进 – shingara 2010-03-11 23:51:46

回答

0

好吧,首先Timeout不是在Rails中定义的类,而是在Ruby中,第二,当你进行系统调用时,Timeout是不可靠的。

Ruby使用它所谓的绿色线程。假设你有3个线程,你认为所有的线程都可以并行运行,但是如果其中一个线程产生了一个系统调用,那么所有剩下的线程将被阻塞,直到系统调用结束,在这种情况下,Timeout将无法按预期工作,所以最好使用像SystemTimer这样可靠的东西。

+0

我了解绿色线程阻塞问题。我的问题是,Net :: HTTP.get_response是否实际上正在进行一个系统调用,这将阻止并阻止定时器(如timeout.rb)的工作。我怀疑答案是肯定的,但令我感到吃惊的是,通常这似乎不被视为一个问题。没有代码示例似乎使用systemtimer gem。或者有什么我错过了? – Frank 2010-03-13 10:12:32

+0

据我所知答案是肯定的,Net :: HTTP.get_response进行系统调用,所以它会阻塞。 – raf 2010-03-26 02:21:23