【问题标题】:Mechanize - Receiving Errno::EMFILE: Too many open files - socket(2) after a day机械化 - 接收 Errno::EMFILE:打开的文件太多 - 一天后的套接字(2)
【发布时间】:2014-01-12 21:59:15
【问题描述】:

我正在运行一个应用程序,它使用 mechanize 每隔一段时间从 RSS 提要中获取一些数据。

它作为 heroku 工作者运行,大约一天后我收到以下错误: Errno::EMFILE: 打开的文件太多 - socket(2)

我无法在 mechanize 中找到“关闭”方法,我需要做些什么才能关闭浏览器会话吗?

以下是我创建浏览器 + 读取信息的方法:

  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

提前致谢!

【问题讨论】:

  • 到目前为止有什么运气吗?我在下面提供的解决方案与您现有的代码有点不同——从抽象函数到内置函数——但应该准确地完成你想要做的事情。

标签: ruby-on-rails ruby heroku mechanize


【解决方案1】:

由于您无法手动关闭Mechanize 的每个实例,您可以尝试将Mechanize 作为一个块调用。根据the docs

块执行后,实例被清理。这包括关闭所有打开的连接。

因此,与其将Mechanize.new 抽象为自定义函数,不如尝试通过start 类方法运行Mechanize,它会在请求完成后自动关闭所有连接:

Mechanize.start do |m|
  m.get("http://example.com")
end 

【讨论】:

  • 很快就会试试这个 - 非常感谢,我完全看错了!
【解决方案2】:

我遇到了同样的问题。 @zeantsoi 的 Mechanize 启动示例是我最终遵循的答案,但如果您想在没有他们的阻止的情况下手动执行此操作,还有一个 Mechanize.shutdown 方法。

还有一个选项可以在 post_connect_hooks 上添加 lambda Mechanize.new.post_connect_looks << lambda {|agent, url, response, response_body| agent.shutdown }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多