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 性能问题的主要内容,如果未能解决你的问题,请参考以下文章