【问题标题】:Getting "can't create Thread: Resource temporarily unavailable" since I started using Capybara::Poltergeist自从我开始使用 Capybara::Poltergeist 以来,“无法创建线程:资源暂时不可用”
【发布时间】:2016-12-01 14:49:46
【问题描述】:

我最近添加了一些代码,使用 Capybara::Poltergeist 从使用 JavaScript 的页面获取信息。 (如果有选择,我很乐意用其他东西替换它)

我加载页面,输入一些数据,点击一个按钮,等待返回值。

为了尽量减少内存泄漏、僵尸进程等,我使用以下内容:

Capybara.default_driver         = :poltergeist
Capybara.default_max_wait_time  = 60
Capybara.javascript_driver      = :poltergeist

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {js_errors: false} )
end

capybara_session                = Capybara::Session.new(:poltergeist , timeout: 60 )

我做了一些动作.....

capybara_session.try(:reset_session!)
capybara_session.try(:driver).try(:quit)
Capybara.try(:drivers).try(:clear)

但运行几个小时后,我仍然收到“无法创建线程:资源暂时不可用”

知道如何解决或替换这个问题吗?

【问题讨论】:

  • 你试过poltergeist的master分支了吗? 10 月 18 日进行了一项更改,处理尚未发布版本的泄漏,这可能会影响这一点 -
  • 我会试一试,虽然这听起来有点严重。它是一个未关闭的完整线程,而不仅仅是内存泄漏。顺便说一句,我发现的每个退出/清除/重置命令的组合都可以吗?我想添加 ps/kill 系统命令以提高安全性。感谢您的评论。
  • 重置会话!和退出调用看起来很合理 - 不知道为什么需要清除驱动程序,因为所有包含的是已注册的驱动程序块。再次查看您的代码,我还注意到您将第二个参数传递给 Session.new - 第二个参数是正在测试的应用程序(您的用例不需要)。这可能是您的问题的根本原因,因为它会创建一个线程来运行应用程序(除非您有 Capybara.run_server = false)。它应该只是 Capybara::Session.new(:poltergeist)
  • 1) 关于额外的 clear/quit ,我检查了 'ps -ef | grep phantom' ,只有在退出后进程才会消失。 2)关于应用程序,我举了一个如何启动 js_errors: false 的例子,我把它移到了 Session.new 并且它做了同样的事情,所以我现在删除了这段代码。谢谢!
  • 是的,需要退出——Capybara.try(:drivers).try(:clear) 可能对你没有任何帮助

标签: javascript ruby-on-rails multithreading capybara poltergeist


【解决方案1】:

这里的主要问题是 Session.new 的错误使用。 Session.new 的第二个参数应该是正在测试的应用程序,如果传入,则会触发为该应用程序创建服务器线程。由于您实际上并未测试应用程序,因此该参数应为 nil(默认为),所以

capybara_session = Session.new(:poltergeist)

timeout: 60 选项在创建时传递给驱动程序。

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, js_errors: false, timeout: 60 )
end

【讨论】:

    【解决方案2】:

    就像我现在使用的选项的回顾一样。 似乎是一个很好的性能组合并且没有松散的线程。

    timeout                                               = 45
    Capybara.run_server                                   = false
    Capybara.default_max_wait_time                        = timeout
    Capybara.default_driver                               = :poltergeist
    Capybara.javascript_driver                            = :poltergeist
    capybara_session                                      = Capybara::Session.new(:poltergeist , timeout: timeout , js_errors: false )
    capybara_session.driver.options[:js_errors]           = false
    capybara_session.driver.options[:timeout]             = timeout
    capybara_session.driver.options[:debug]               = true
    capybara_session.driver.options[:phantomjs_logger]    = true
    capybara_session.driver.options[:stdout]              = true
    capybara_session.driver.options[:phantomjs_options]   = ['--proxy-type=none','--load-images=no','--ignore-ssl-errors=yes','--ssl-protocol=any','--web-security=false','--debug=true']
    

    对会话执行一些操作......

    capybara_session.try(:reset_session!)
    
    capybara_session.try(:driver).try(:quit)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多