我正在运行一个应用程序,该应用程序使用 mechanize 每隔一段时间从 RSS 提要中获取一些数据。
它作为 heroku worker 运行,大约一天后我收到以下错误: Errno::EMFILE: 打开的文件太多 - socket(2)
我无法在 mechanize 中找到“关闭”方法,是否需要执行任何特殊操作才能关闭我的浏览器 session ?
下面是我创建浏览器+阅读信息的方式:
def mechanize_browser
@mechanize_browser ||= begin
agent = Mechanize.new
agent.redirect_ok = true
agent.request_headers = {
'Accept-Encoding' => "gzip,deflate,sdch",
'Accept-Language' => "en-US,en;q=0.8",
}
agent
end
end
并实际获取信息:
response = mechanize_browser.get(url)
然后在响应后关闭:
def close_mechanize_browser
@mechanize_browser = nil
end
提前致谢!
最佳答案
由于您无法手动关闭 Mechanize
的每个实例,您可以尝试将 Mechanize
作为一个 block 调用。根据the docs :
After the block executes, the instance is cleaned up. This includes closing all open connections.
因此,与其将 Mechanize.new
抽象为自定义函数,不如尝试通过 start
类方法运行 Mechanize
,它应该会自动关闭完成请求后的所有连接:
Mechanize.start do |m|
m.get("http://example.com")
end
关于ruby-on-rails - Mechanize - 接收 Errno::EMFILE:打开的文件太多 - 一天后套接字(2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20764617/