Ruby 和 Timeout.timeout 性能问题

Posted

技术标签:

【中文标题】Ruby 和 Timeout.timeout 性能问题【英文标题】:Ruby and Timeout.timeout performance issue 【发布时间】:2012-01-08 03:23:28 【问题描述】:

我不确定如何解决我的应用程序的这个大性能问题。我正在使用 open-uri 从 youtube 请求最受欢迎的视频,当我运行 perftools https://github.com/tmm1/perftools.rb

这表明最大的性能问题是 Timeout.timeout。谁能建议我如何解决这个问题?

我使用的是 ruby​​ 1.8.7。

编辑:

这是我的分析器的输出

https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0B4bANr--YcONZDRlMmFhZjQtYzIyOS00YjZjLWFlMGUtMTQyNzU5ZmYzZTU4&hl=en_US

【问题讨论】:

请显示实际的分析输出,不要只告诉我们,这样我们就能看到您所看到的。 归咎于超时,但块内的代码可能正在等待来自远程服务器的响应。我同意需要添加输出以便更好地理解。 我已将我的输出上传到谷歌文档docs.google.com/… 【参考方案1】:

Timeout 是对实际做这项工作的函数进行包装,以确保如果服务器在一定时间内没有响应,代码会引发错误并停止执行。

我怀疑您看到的是服务器需要一些时间来响应。您应该考虑以某种方式缓存响应。

例如,使用memcached(伪代码)

require 'dalli'
require 'open-uri'

DALLI = Dalli.client.new

class PopularVideos
  def self.get
    result = []
    unless result = DALLI.get("videos_#Date.today.to_s")
      doc = open("http://youtube/url")
      result = parse_videos(doc) # parse the doc somehow
      DALLI.set("videos_#Date.today.to_s", result)
    end
    result
  end
end

PopularVideos.get # calls your expensive parsing script once
PopularVideos.get # gets the result from memcached for the rest of the day

【讨论】:

另外,我注意到您正在使用 Sinatra。使用 Padrino(扩展 Sinatra),您可以获得一些有用的缓存扩展。 非常感谢。还有什么我应该改变的。:-)

以上是关于Ruby 和 Timeout.timeout 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

ruby 超时和系统命令

exec-timeout,session-timeout,timeout

mysql设置连接等待时间(wait_timeout)

keepalive 配置文件在哪

Rxjava2 Observable的辅助操作详解及实例

关于mysql限制