13

在 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 脚本有计时器,如果需要超过一分钟,则重试加载页面,phantom.exit()如果页面无法加载/PDF 生成失败,则最终调用。因此,即使出现问题,该过程仍应退出 - 但事实并非如此。

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

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

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

作为旁注,我已经使用 PhantomJS 几年了,现在只按顺序执行相同的过程(一次运行一个 PhantomJS 进程)。尽管有一些障碍需要克服,但效果很好。

知道是什么原因造成的吗?有人遇到过类似的问题吗?关于并行运行多个 PhantomJS 实例有什么建议吗?

谢谢!

4

2 回答 2

0

我面临着同样的问题。使用 driver.quit() 而不是 driver.close()。这为我解决了这个问题。

于 2016-10-06T11:22:04.713 回答
0

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

于 2016-03-30T04:16:14.727 回答