带有嵌入式Web服务器的PhantomJS仅使用一个CPU

时间:2015-03-24 20:27:47

标签: javascript highcharts mongoose phantomjs

我在使用PhantomJS和多线程方式的Web服务器模块时遇到问题 我正在使用PhantomJS 2.0在服务器端使用Java创建高价图,正如here所解释的那样(和代码here)。 它运行良好,在测试多种尺寸的图形时,我得到的结果非常一致,创建图形大约需要0.4秒。

我链接的代码最初由highcharts团队发布,它也在http://export.highcharts.com/的导出服务器中使用。为了支持并发请求,它保留了一个衍生的PhantomJS进程池,基本上它的模型是每个并发请求一个phantomjs实例。

我看到网络服务器模块最多支持10个并发请求(这里有解释),所以我想我可以利用它来保存池中较少数量的PhantomJS进程。但是,当我尝试使用更多线程时,我经历了线性减速,就像PhantomJS只使用一个CPU一样。这个减速如下所示(对于一个PhantomJS实例):

1个客户端线程,平均请求时间0.44秒 2个客户端线程,平均请求时间0.76秒 4个客户端线程,平均请求时间为1.5秒。

这是PhantomJS的已知限制吗?有办法吗?

(问题还发布了here

1 个答案:

答案 0 :(得分:5)

  

这是PhantomJS的已知限制吗?

是的,这是一个预期的限制,因为PhantomJS对所有内容使用相同的WebKit引擎,并且由于JavaScript是单线程的,这实际上意味着每个请求将一个接一个地处理(可能是互锁的),但从不同时。每个客户的平均总时间将呈线性增长。

documentation说:

  

目前有10个并发请求的限制;任何其他请求将排队等候。

并发和并行请求的概念之间存在差异。 并发只是意味着任务以非确定性方式完成。它并不意味着构成任务的指令在不同(虚拟)内核上并行执行。

  

有办法吗?

除了通过child_process运行服务器任务,。 JavaScript支持多线程的方式是使用Web Workers,但是一个worker被沙箱化,无法访问require,因此无法创建页面来执行操作。