【问题标题】:Are rails timers reliable when using Net::HTTP?使用 Net::HTTP 时,rails 计时器是否可靠?
【发布时间】:2011-01-26 13:30:51
【问题描述】:

从可能很慢的网站读取数据时,我想确保 get_response 不会挂起,因此添加了一个计时器以在 x 秒后超时。到目前为止,一切都很好。然后我阅读了http://ph7spot.com/musings/system-timer,它说明在某些情况下 timer.rb 由于 ruby​​ 的线程实现而无法工作。

有人知道这是不是其中一种情况吗?

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

【问题讨论】:

  • 不知何故我的代码示例被修改了。
  • 已为您修复。所有代码都需要缩进 4(四个)空格。
  • 在 ruby​​ 中的约定是缩进 2(两个)空格

标签: ruby-on-rails http multithreading timeout


【解决方案1】:

嗯,首先 Timeout 不是在 Rails 中定义的类,而是在 Ruby 中定义的,其次,在您进行系统调用的情况下,Timeout 并不可靠。

Ruby 使用所谓的绿色线程。假设您有 3 个线程,您认为所有线程都将并行运行,但如果其中一个线程进行系统调用,则所有其余线程将被阻塞,直到系统调用完成,在这种情况下,超时将无法按预期工作,所以最好使用像 SystemTimer 这样可靠的东西。

【讨论】:

  • 我了解绿色线程阻塞问题。我的问题是 Net::HTTP.get_response 是否实际上正在进行系统调用,该系统调用将阻塞并因此阻止计时器(如 timeout.rb 中的)工作。我怀疑答案是肯定的,但令我惊讶的是,通常这似乎并不被视为一个问题。似乎没有代码示例使用 systemtimer gem。还是我错过了什么?
  • 据我所知答案是肯定的,Net::HTTP.get_response 进行系统调用,所以它阻塞了。
猜你喜欢
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
相关资源
最近更新 更多