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

PhantomJS with embedded web server uses only one CPU

我在以多线程方式将 PhantomJS 与 Web 服务器模块结合使用时遇到问题,并发请求。
我正在使用 PhantomJS 2.0 在服务器端使用 Java 创建 highstock 图表,如 here (and the code 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

Is this a known limitation of PhantomJS?

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

documentation 说:

There is currently a limit of 10 concurrent requests; any other requests will be queued up.

并发请求和并行请求的概念有所不同。 并发 只是意味着任务不确定地完成。这并不意味着构成任务的指令在不同的(虚拟)内核上并行执行。

Is there a way around it?

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