PhantomJS与嵌入式web服务器只使用一个CPU

PhantomJS with embedded web server uses only one CPU

本文关键字:CPU 一个 嵌入式 web 服务器 PhantomJS      更新时间:2023-09-26

我在以多线程方式将PhantomJS与web服务器模块一起使用时遇到问题,并发请求
我使用PhantomJS 2.0在服务器端用Java创建高库存图,如这里所解释的(以及这里的代码)。它工作得很好,当测试几种大小的图时,我得到的结果非常一致,大约需要0.4秒才能创建一个图。

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

我看到Web服务器模块最多支持10个并发请求(在这里解释),所以我想我可以利用它在我的池中保留较少数量的PhantomJS进程。然而,当我尝试使用更多的线程时,我遇到了线性的速度减慢,就好像PhantomJS只使用一个CPU一样。这种减慢如下所示(对于单个PhantomJS实例):

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

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

(问题也发布在这里)

这是PhantomJS的已知限制吗

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

文件上写着:

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

并发请求和并行请求的概念是不同的Concurrent只是指任务以非确定性的方式完成。这并不意味着组成任务的指令在不同的(虚拟)内核上并行执行。

有办法绕过它吗

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