我在使用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)
答案 0 :(得分:5)
这是PhantomJS的已知限制吗?
是的,这是一个预期的限制,因为PhantomJS对所有内容使用相同的WebKit引擎,并且由于JavaScript是单线程的,这实际上意味着每个请求将一个接一个地处理(可能是互锁的),但从不同时。每个客户的平均总时间将呈线性增长。
目前有10个并发请求的限制;任何其他请求将排队等候。
并发和并行请求的概念之间存在差异。 并发只是意味着任务以非确定性方式完成。它并不意味着构成任务的指令在不同(虚拟)内核上并行执行。
有办法吗?
除了通过child_process运行服务器任务,否。 JavaScript支持多线程的方式是使用Web Workers,但是一个worker被沙箱化,无法访问require
,因此无法创建页面来执行操作。