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

Yon*_*oni 5 javascript mongoose highcharts phantomjs

我有一个问题,使用PhantomJS与Web服务器模块以多线程方式,并发请求.
我使用PhantomJS 2.0创建highstock在服务器端的Java图形,如解释在这里(和代码在这里).它运行良好,当测试几种尺寸的图形时,我得到的结果非常一致,创建图形大约需要0.4秒.

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

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

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

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

(问题也贴在这里)

Art*_* B. 5

这是PhantomJS的已知限制吗?

是的,这是一个预期的限制,因为PhantomJS使用相同的WebKit引擎,因为JavaScript是单线程的,这实际上意味着每个请求将一个接一个地处理(可能是互锁的),但从不同时处理.平均总时间将随每个客户线性增加.

文件说:

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

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

有办法解决吗?

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