आप फ़ैंटॉमजेएस (और स्लिमरजेएस) के साथ ऐसा कर सकते हैं: प्रत्येक अनुरोध के लिए बस एक नया page
उदाहरण बनाएं। नीचे लिपि एक पूर्ण उदाहरण है। (चेतावनी: यदि आपका पृष्ठ कई अन्य संसाधनों का अनुरोध करता है तो यह काफी वर्बोज़ है।) स्क्रिप्ट शुरू होने के बाद बाईं ओर की संख्या मिलीसेकंड है।
मेरी मशीन example.com पर स्थानीयहोस्ट को इंगित करता है, और बाधा अपाचे थी। जैसे जब मैं एन = 30 के साथ दौड़ता हूं तो इसे चलाने में लगभग 5 सेकंड लगते हैं। यदि मैं इसे तुरंत फिर से चलाता हूं, तो इसमें 0.75 सेकंड लग गए (क्योंकि पर्याप्त अपाचे उदाहरण पहले से ही फैल गए थे)। जब मैंने एन = 100 के साथ प्रयास किया तो इसमें लगभग 12 सेकंड लग गए, और मेरी खराब नोटबुक पर भारी भार बनाया।
यह साबित करने के लिए पर्याप्त था कि ब्राउज़र की 6-कनेक्शन सीमा नहीं मारा जा रहा था, और सभी 100 कनेक्शन वास्तव में एक ही समय में चल रहे थे। यदि यह अभी भी आपके लिए समानांतर नहीं है, तो फ़ैंटॉमजेएस के 8 उदाहरण शुरू करने के लिए एक बैश स्क्रिप्ट का उपयोग करें (मान लें कि आपके पास 8 कोर हैं)। नोट: सभी पृष्ठ उदाहरण ब्राउज़र कैश साझा कर रहे हैं। तो उदाहरण के लिए, मैं jQuery के लिए एक ही अनुरोध देखता हूं।
सटीक वही स्क्रिप्ट स्लिमरजेएस पर चलती है, लेकिन व्यवहार काफी अलग है। प्रत्येक उदाहरण को शुरू करने में अधिक ओवरहेड होता है, लेकिन अधिक महत्वपूर्ण बात यह है कि प्रत्येक के पास अपनी डिस्क कैश होती है। तो मेरे परीक्षण समय में JQuery के लिए Google सीडीएन के लिए 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
}
स्रोत
2013-11-08 02:02:16
'यदि यह अभी भी आपके लिए समानांतर नहीं है, तो फ़ैंटॉमजेएस के 8 उदाहरण शुरू करने के लिए एक बैश स्क्रिप्ट का उपयोग करें, मैं [समानांतर] के साथ phantomjs का उपयोग करता हूं (https://www.gnu.org/software/parallel /) 3 अलग-अलग संकल्पों में साइटों का एक गुच्छा स्क्रैप/स्क्रीनशॉट करने के लिए, इसलिए यदि आप बैश मार्ग पर जाते हैं, तो समानांतर पर विचार करें। – birdspider