PhantomJS (및 SlimerJS)로 할 수 있습니다. 각 요청마다 새로운 page
인스턴스를 만듭니다. 아래 스크립트는 전체 예제입니다. (경고 : 페이지가 다른 많은 리소스를 요청할 경우 매우 자세한 내용입니다.) 왼쪽의 숫자는 스크립트가 시작된 후 밀리 초입니다.
내 컴퓨터에서 example.com은 localhost를 가리키며 병목 현상은 Apache입니다. 예 : N = 30으로 실행하면 약 5 초가 걸립니다. 그런 다음 즉시 다시 실행하면 0.75 초가 걸립니다 (충분한 Apache 인스턴스가 이미 스핀 업 되었기 때문에). N = 100으로 시도했을 때 약 12 초가 걸렸고 불쌍한 노트북에 막대한 부하를주었습니다.
브라우저의 6 연결 제한에 맞지 않고 100 개의 모든 연결이 동시에 실행되고 있음을 증명하기에 충분했습니다. 아직 충분히 병렬 적이 지 않다면 bash 스크립트를 사용하여 8 개의 PhantomJS 인스턴스 (8 코어 있다고 가정)를 시작하십시오. 참고 : 모든 페이지 인스턴스가 브라우저 캐시를 공유하고 있습니다. 그래서 저는 jQuery에 대한 단일 요청을 봅니다.
똑같은 스크립트가 SlimerJS에서 실행되지만 동작은 매우 다릅니다. 거기에 보이는 것처럼 각 인스턴스를 시작하는 데 더 많은 오버 헤드가 있지만 더 중요한 것은 각각 자체 디스크 캐시가 있다는 것입니다. 그래서 테스트 시간에는 JQuery 용 Google CDN에 대한 30 건의 요청이 포함되었습니다.
(요구 PhantomJS 캐시를 공유하지 구성 할 수 있습니다, 또는 내가 오프 손 모르는로 SlimerJS는, 아마도, 다른 StackOverflow의 질문해야 할 수 있습니다. 경우)
/**
* This calls N instances of URL in parallel
*/
var url = "http://example.com/";
var N = 30;
var cnt = 0;
function onResourceReceived(response) {
console.log((Date.now() - startTime) + ':' + response.stage + ':' + response.url);
}
function onResourceRequested(requestData, networkRequest) {
console.log((Date.now() - startTime) + ':Request:' + requestData.url);
}
function onCompletion(status) {
++cnt;
console.log((Date.now() - startTime) + ':COMPLETE(' + cnt + '):' + status + ':' + this.url);
if (cnt >= N) phantom.exit();
}
var startTime = Date.now();
for (var i = 0; i < N; i++) {
var page = require('webpage').create();
page.onResourceReceived = onResourceReceived;
page.onResourceRequested = onResourceRequested;
page.open(url + "?i=" + i, onCompletion); //Append i to allow tracking
}
'아직 충분히 병렬 적이 지 않다면, bash 스크립트를 사용하여 PhantomJS의 8 인스턴스를 시작하십시오. 나는 [parallel] (https://www.gnu.org/software/parallel)와 함께 phantomjs를 사용합니다. /) 3 개의 다른 resolutins에있는 많은 사이트들을 긁어 모으거나 스크린 샷을 찍으려고합니다. 그래서 만약 당신이 bash 방식으로 간다면, 평행을 고려하십시오. – birdspider