多个PhantomJS实例挂起

时间:2015-07-07 14:08:10

标签: javascript phantomjs scalability hang contention

在Ubuntu 14上运行多个PhantomJS实例时遇到问题。几分钟后,进程无响应。

简要背景: 使用PhantomJS 2.0渲染最终使用Wkhtmtopdf保存为PDF的网页。 PhantomJS仅负责加载页面,发出ajax请求,并在将PDF保存在服务器上之后等待响应。它不会生成PDF本身。 有数百个网页需要生成PDF,所以我想在系统允许的情况下并行运行尽可能多的PhantomJS实例。

每个PhantomJS进程都是由shell脚本启动的,如下所示: {path to phantomjs} {path to js file} --data {some argument} >> {path to log file} 2>&1 &

问题发生在几分钟后,我停止从PhantomJS进程获得任何输出,并查看top我可以看到他们只是在那里做任何事情。 JS脚本具有在超过一分钟时重试加载页面的计时器,并且如果页面无法加载/ PDF生成失败,则最终调用phantom.exit()。因此,即使出现问题,该过程仍应退出 - 但事实并非如此。

我尝试更改并行运行的PhantomJS实例的数量。试过20 - > 10 - > 5 - > 3,但似乎并不重要。实际上,当一次维护20个实例时,我可以成功执行更多作业。

--debug=true一起运行时,我可以看到它在某些时候陷入困境  [DEBUG] WebPage - updateLoadingProgress: 同时通过输出我看到其中几个警告: [WARNING] QIODevice::write: device not open 这让我相信这是问题的根源。

我认为可能存在一些争用文件资源的问题所以我试过没有将输出重定向到日志文件,而没有使用--local-storage-path,但这没有帮助。

作为旁注,我几年来一直在使用PhantomJS执行相同的过程,只是顺序执行(一次运行一个PhantomJS进程)。虽然有一些障碍需要克服,但效果很好。

知道是什么导致了这个吗? 有人遇到过类似的问题吗? 有关并行运行多个PhantomJS实例的任何建议吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我在本地和我的CI服务器(也是Ubuntu)上遇到了完全相同的问题。卸载2.0.0并升级到2.1.1解决了我的问题。

答案 1 :(得分:0)

我遇到了同样的问题。使用driver.quit()而不是driver.close()。这解决了我的问题。