【发布时间】: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