PhantomJS与嵌入式web服务器只使用一个CPU
PhantomJS with embedded web server uses only one CPU
我在以多线程方式将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
,因此无法创建页面来执行任务。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- jQuery:循环一个具有不同超时值的循环
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 从javascript创建一个列表
- 节点导出返回一个空对象
- 使用clickToggle并在单击另一个元素时关闭元素
- 我可以在json对象中添加一个函数吗
- 使用javascript将动态表从一个html页面打印到另一个html页
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 表追加而不附加最后一个元素
- 我如何找到一个句子中的所有空格并替换忽略它们
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 使用类从一个标记中双击事件
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 我应该如何从xml文件构建一个javascript页面
- PhantomJS与嵌入式web服务器只使用一个CPU
- 我如何运行一个繁重的cpu和内存HTML/javascript程序?(firefox、chrome崩溃)