cpu:phantom:page的比例可以大于1:1:1吗
Can the ratio of cpu:phantom:page be more than 1:1:1
我是否可以为每个CPU创建更多的PhantomJS进程,或者为每个phantom进程同时创建多个网页实例?
例如,1:1:1意味着:1台带有4个CPU的pc,我生成4个PhantomJS进程并在每个进程中同时创建1个<strong]网页>。
这是对并发性的限制。
有没有一个好的方法来证明我可以改变1:1:1的比例,哪个比例是好的?
如果phantom:page的比率为1:n,是否会出现上下文切换竞争条件,这会导致PhantomJS错误?
没有所谓的三向比率。一个比率恰好有两个方面。既然我们已经解决了这个问题,让我们把比例分开。
我们可以用x个可用线程(CPU/内核)和y个PhantomJS进程来定义x:y。然后我们可以用z个page
实例来定义y:z。
核心与过程
只要硬件(主要是RAM)支持,就可以运行任意数量的PhantomJS进程。但对于大多数体系结构(全部?),当y > x
时,相对性能(y/x
)会下降。当您有许多进程而没有那么多核心时,至少两个进程必须共享一个核心(如果您有多线程,则必须共享线程)。因此,这两个过程不会像其他过程那样快。这与PhantomJS无关,而是正常的多进程行为。
如果您有y >> x
,那么即使是进程的上下文切换也可能成为瓶颈,并且一切都将非常缓慢。
总是希望只产生与你有核心/线程一样多的进程(可能更少)。
对于几乎所有情况,PhantomJS进程默认情况下都是独立运行的。只有当它们运行的页面使用localStorage时,您可能会遇到问题。localStorage始终保持在磁盘上,无法更改这一点。
PhantomJS流程与page
实例
PhantomJS运行JavaScript脚本。由于JavaScript作为一个整体是单线程的,您无法获得任何并行处理,但您可以通过正常的JavaScript事件循环获得并发性。
PhantomJS支持每个进程有多个page
实例,这运行得很好,但当然,由于JavaScript是单线程的,所以多个页面的执行是交错的。这意味着在";"同时";应该会导致或多或少与一个接一个地打开它们所需的时间相同。
严格来说,情况并非如此,因为等待一个页面的资源可以使其他页面进行进一步处理。当页面按顺序打开时,一个页面等待加载资源的时间将无法被其他页面使用。
另一方面,不能在一个进程中使用大量的page
实例,因为不同页面的请求会相互阻碍。HTTP请求在TCP上运行。如果有多个TCP在争夺带宽,则连接的总体效率较低。但这仍然应该比顺序情况更快。这就是为什么HTTP/2(SPDY)是一个好主意。
并发处理比顺序处理更快,但更难编程管理每个PhantomJS进程的多个page
实例(甚至可能用于多个进程)。
基准:多个page
实例
此脚本显示请求站点的两个版本。第一次迭代的结果大不相同,因为缓存还没有填满。缓存稍后无法清除,因此每次迭代都会在第一次迭代之后使用缓存的资源。
var urls = [
'https://google.com',
'http://stackoverflow.com/contact',
'http://stackoverflow.com/questions?pagesize=15&sort=newest',
'http://www.spiegel.de/'
];
function sequential(callback) {
var copiedUrls = JSON.parse(JSON.stringify(urls)),
page = require('webpage').create(),
start = (new Date()).getTime();
function sequentialHelper(){
//console.log("seqHelp " + copiedUrls.length);
if (copiedUrls.length == 0) {
start = (new Date()).getTime() - start;
page.close();
callback(start);
return;
}
page.open(copiedUrls.shift(), function(s){
sequentialHelper();
});
}
sequentialHelper();
}
function parallel(callback) {
var copiedUrls = JSON.parse(JSON.stringify(urls)),
max = copiedUrls.length,
pages = [],
start;
function checkFin(){
max--;
//console.log("parCheck " + max);
if (0 === max) {
start = (new Date()).getTime() - start;
pages.forEach(function(page){
page.close();
});
callback(start);
}
}
start = (new Date()).getTime();
copiedUrls.forEach(function(url){
var page = require('webpage').create();
pages.push(page);
page.open(url, function(s){
checkFin();
});
});
}
var repeat = 5,
current = 0,
times = [];
function repeater(){
if (current === repeat) {
console.log(JSON.stringify(times, undefined, 4));
phantom.exit();
}
console.log("repeated: " + (current+1));
var t = {
par: (new Date()).getTime()
};
parallel(function(innerTime){
t.par = (new Date()).getTime() - t.par;
t.pari = innerTime;
t.seq = (new Date()).getTime();
sequential(function(innerTime){
t.seq = (new Date()).getTime() - t.seq;
t.seqi = innerTime;
times.push(t);
repeater();
});
});
current++;
}
repeater();
输出:
[
{
"par": 10653,
"pari": 10652,
"seq": 5304,
"seqi": 5301
},
{
"par": 2936,
"pari": 2936,
"seq": 5224,
"seqi": 5219
},
{
"par": 3167,
"pari": 3167,
"seq": 4478,
"seqi": 4474
},
{
"par": 2506,
"pari": 2506,
"seq": 6868,
"seqi": 6862
},
{
"par": 2479,
"pari": 2479,
"seq": 3753,
"seqi": 3749
}
]
- 使图像在单击时展开到不大于浏览器
- Jquery如何检查今天的时间大于使用给定时间
- cpu:phantom:page的比例可以大于1:1:1吗
- 正则表达式(JavaScript),用于创建数字必须大于x的数据验证
- Regex允许数字大于0.5
- CasperJS(phantom 1.9.7),从昨天起就无法连接https
- JavaScript对象作为哈希?复杂性是否大于O(1)
- scrypt.js失败,N大于2^14
- Javascript平等三重等于,但是大于和小于呢?
- RegEx接受小于-50.0或大于80.0的数字
- 链接的转换延迟大于内容
- 如果类中的数字大于0,请使用JavaScript更改CSS背景
- 在选择更改时显示大于/小于的隐藏字段集
- Jquery”;大于“;象征
- 当天数大于月份的天数时,javascript日期会创建奇怪的日期
- 如何在JSDoc中记录深度大于2的符号
- 我无法上传大于2.5 M的图像
- jQuery检查CSS宽度是否大于0,然后添加CSS属性
- 网页's使用Phantom的HTML
- 为什么对象大于/小于或等于不同的对象