Mechanize - 接收Errno :: EMFILE:打开文件太多 - 一天后socket(2)

时间:2013-12-24 17:24:40

标签: ruby-on-rails ruby heroku mechanize

我正在运行一个应用程序,它使用mechanize来经常从RSS提要中获取一些数据。

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

我无法在机械化中找到“关闭”方法,为了关闭浏览器会话,我需要做些什么特别的事情吗?

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

  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

提前致谢!

2 个答案:

答案 0 :(得分:5)

由于您手动无法关闭Mechanize的每个实例,因此您可以尝试调用Mechanize作为块。根据{{​​3}}:

  

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

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

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

答案 1 :(得分:2)

我遇到了同样的问题。 @zeantsoi的Mechanize启动示例是我最终得到的答案,但是如果你想手动执行此操作而没有它们的阻塞,那么还有一个Mechanize.shutdown方法。

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