2010-05-13 14 views
10

पायथन में एक छोटा सा वेब क्रॉलर लिखना चाहता था। मैं इसे एक बहुप्रचारित लिपि, धागे डाउनलोड करने के एक पूल और एक पूल प्रसंस्करण के परिणाम के रूप में लिखने की जांच शुरू कर रहा था। जीआईएल के कारण यह वास्तव में एक साथ डाउनलोड करेगा? जीआईएल एक वेब क्रॉलर को कैसे प्रभावित करता है? क्या प्रत्येक थ्रेड सॉकेट से कुछ डेटा उठाएगा, फिर अगले थ्रेड पर चलेगा, इसे सॉकेट से कुछ डेटा चुनने दें, आदि ..?क्या पाइथन में एक बहुप्रचारित क्रॉलर वास्तव में चीजों को गति देता है?

मूल रूप से मैं पूछ रहा हूं कि पाइथन में एक बहु थ्रेडेड क्रॉलर वास्तव में मुझे बहुत अधिक बनाम बनाम एकल थ्रेड खरीदने जा रहा है?

धन्यवाद!

उत्तर

1

जब क्रॉलिंग की बात आती है तो आप कुछ घटना-आधारित जैसे Twisted का उपयोग कर बेहतर हो सकते हैं जो गैर-अवरुद्ध एसिंक्रोनस सॉकेट ऑपरेशंस का उपयोग करता है ताकि प्रत्येक को अवरुद्ध करने के बजाय डेटा लाने और वापस लौटाया जा सके।

असिंक्रोनस नेटवर्क ऑपरेशंस आसानी से हो सकते हैं और आमतौर पर सिंगल-थ्रेडेड होते हैं। नेटवर्क I/O लगभग हमेशा सीपीयू की तुलना में अधिक विलंबता है क्योंकि आपको वास्तव में कोई जानकारी नहीं है कि एक पृष्ठ कितना समय वापस ले रहा है, और यह वह जगह है जहां एसिंक चमकता है क्योंकि एक एसिंक ऑपरेशन थ्रेड की तुलना में बहुत हल्का वजन होता है।

संपादित करें: यहां एक आसान वेब क्रॉलर बनाने के लिए ट्विस्टेड के getPage का उपयोग करने के लिए simple example है।

+0

ट्विस्ट का उपयोग न करें। Gevent का प्रयोग करें। यह कवर के तहत async io का उपयोग करता है लेकिन आपको एक सीधा बहु-थ्रेडेड तरीके से कोड करने की अनुमति देता है। –

8

नेटवर्क संचालन करते समय जीआईएल पायथन दुभाषिया द्वारा आयोजित नहीं किया जाता है। यदि आप ऐसे काम कर रहे हैं जो नेटवर्क-बाउंड (क्रॉलर की तरह) है, तो आप सुरक्षित रूप से जीआईएल के प्रभावों को अनदेखा कर सकते हैं।

दूसरी ओर, यदि आप प्रसंस्करण कर रहे हैं (डाउनलोड करने के बाद) बहुत सारे धागे बनाते हैं तो आप अपने प्रदर्शन को मापना चाहेंगे। धागे की संख्या सीमित करने से आपके प्रदर्शन पर जीआईएल के प्रभाव कम हो जाएंगे।

6

देखें scrapy काम करता है। यह आपको बहुत मदद कर सकता है। यह धागे का उपयोग नहीं करता है, लेकिन एक ही धागे में सभी "एक साथ" डाउनलोड कर सकते हैं।

यदि आप इसके बारे में सोचते हैं, तो आपके पास केवल एक ही नेटवर्क कार्ड है, इसलिए समांतर प्रसंस्करण वास्तव में परिभाषा द्वारा सहायता नहीं कर सकता है।

क्या स्केपर करता है किसी अन्य भेजने से पहले एक अनुरोध की प्रतिक्रिया के लिए बस प्रतीक्षा करें। सब एक धागे में।

1

एक और विचार: यदि आप एक वेबसाइट को स्क्रैप कर रहे हैं और सर्वर अनुरोधों की आवृत्ति पर सीमा रखता है तो आप अपने आईपी पते से भेज सकते हैं, कई धागे जोड़ना कोई फर्क नहीं पड़ता है।

0

हां, मल्टीथ्रेडिंग स्क्रैपिंग प्रक्रिया की गति को काफी बढ़ा देती है। यह ऐसा कोई मामला नहीं है जहां जीआईएल एक मुद्दा है। आप बहुत सारे निष्क्रिय सीपीयू और अप्रयुक्त बैंडविड्थ को खत्म करने के अनुरोध की प्रतीक्षा कर रहे हैं। यदि आप जिस वेब पेज को स्क्रैप कर रहे हैं वह आपके स्थानीय नेटवर्क (दुर्लभ स्क्रैपिंग केस) में है तो मल्टीथ्रेडिंग और सिंगल थ्रेड स्क्रैपिंग के बीच का अंतर छोटा हो सकता है।

आप बेंचमार्क को अपने आप को "एन" धागे से खेलकर आजमा सकते हैं। मैंने Discovering Web Resources पर एक साधारण मल्टीथ्रेडेड क्रॉलर लिखा है और मैंने Automated Discovery of Blog Feeds and Twitter, Facebook, LinkedIn Accounts Connected to Business Website पर एक संबंधित लेख लिखा है। आप FocusedWebCrawler में NWORKERS क्लास वेरिएबल को बदलने के लिए कितने थ्रेड का उपयोग कर सकते हैं चुन सकते हैं।

संबंधित मुद्दे