ruby-on-rails - Mechanize - 接收 Errno::EMFILE:打开的文件太多 - 一天后套接字(2)

标签 ruby-on-rails ruby heroku mechanize

我正在运行一个应用程序,该应用程序使用 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/

相关文章:

ruby-on-rails - 将 Rails cookie 设置为在 1 天内过期

ruby-on-rails - 在用户模型上存储access_token和refresh_token并再次使用它们会导致错误

mysql - 如何创建与 Rails 中的 View 相对应的模型

ruby - 无法让测试单元启动在 ruby​​ 1.9.2 中工作

ruby-on-rails - 为什么 Module.sum( :field) is integer?

javascript - 为何今天如此插入客户端框架?

ruby-on-rails - Rspec 测试 rake 任务

ruby-on-rails - 如何将我现有的 Rails 应用程序移动到 heroku? (sqlite 到 postgres)

Node.js 应用程序适用于工头,但不适用于 heroku。 404错误

ruby-on-rails - Heroku 不显示(正在查找?).css 和 .js 文件