自从我开始使用 Capybara::Poltergeist 以来得到 "can't create Thread: Resource temporarily unavailable"

Getting "can't create Thread: Resource temporarily unavailable" since I started using Capybara::Poltergeist

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

我加载页面,向其中输入一些数据,单击按钮,等待 return 值。

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

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)

但是我运行几个小时后仍然得到"can't create Thread: Resource temporarily unavailable"

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

这里的主要问题是 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

作为对我现在使用的选项的回顾。 似乎是一个很好的性能组合,没有松散的线程。

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)