2012-05-11 15 views
7

संभव डुप्लिकेट:
Multiple (asynchronous) connections with urllib2 or other http library?पायथन पर एकाधिक HTTP अनुरोध भेजने के लिए आदर्श विधि?

मैं एक लिनक्स वेब सर्वर है कि एक 3 पार्टी एपीआई से HTTP पर रियल टाइम डेटा हड़पने के लिए अजगर कोड चलाता है पर काम कर रहा हूँ। डेटा को एक MySQL डेटाबेस में रखा जाता है। मुझे बहुत सारे यूआरएल के लिए बहुत सारे प्रश्न पूछने की ज़रूरत है, और मुझे इसे तेज़ (तेज़ = बेहतर) करने की ज़रूरत है। वर्तमान में मैं urllib3 का उपयोग अपनी HTTP लाइब्रेरी के रूप में कर रहा हूं। इस बारे में जाने का सबसे अच्छा तरीका क्या है? क्या मुझे एकाधिक धागे पैदा करना चाहिए (यदि हां, तो कितने?) और प्रत्येक क्वेरी को एक अलग यूआरएल के लिए रखना चाहिए? मुझे इसके बारे में आपके विचार सुनना अच्छा लगेगा - धन्यवाद!

उत्तर

23

तो एक बहुत वास्तव में एक बहुत से आप शायद अतुल्यकालिक नहीं कब धागे का उपयोग करना चाहते हैं।

requests + gevent = grequests

GRequests आप Gevent साथ अनुरोध उपयोग करने के लिए आसानी से अतुल्यकालिक HTTP अनुरोध बनाने के लिए अनुमति देता है।

import grequests 

urls = [ 
    'http://www.heroku.com', 
    'http://tablib.org', 
    'http://httpbin.org', 
    'http://python-requests.org', 
    'http://kennethreitz.com' 
] 

rs = (grequests.get(u) for u in urls) 
grequests.map(rs) 
+1

मैं लगभग 50,000 यूआरएल के अनुरोध भेजने के लिए इस विधि का उपयोग करना चाहता हूं। क्या यह एक अच्छी रणनीति है? इसके अलावा, टाइमआउट आदि जैसे अपवादों के बारे में क्या? – John

+0

@ जॉन हाँ, यह है। अपवादों के रूप में ['safe_mode'] (http://requests.readthedocs.org/en/latest/api/) पैरामीटर और समस्या [953] देखें (https://github.com/kennethreitz/requests/pull/953) –

+5

मैं grequest का उपयोग कर 30 से अधिक अनुरोध नहीं भेज सकता। जब मैं करता हूं, तो मुझे "मैक्स रीट्रीज़ यूआरएल से अधिक हो जाता है: ..., बहुत सारी खुली फाइलें"। क्या इस समस्या को दूर करने के लिए कोई उपाय है? – AliBZ

1

आप बहु सूत्रण के साथ-साथ पाइपलाइनिंग अनुरोध का उपयोग करना चाहिए। उदाहरण के लिए खोज-> विवरण-> बचाने

धागे आप उपयोग कर सकते हैं केवल अपने उपकरणों पर निर्भर नहीं करता की संख्या। सेवा कितने अनुरोध कर सकती है? कितने समवर्ती अनुरोध इसे चलाने की अनुमति देते हैं? यहां तक ​​कि आपकी बैंडविड्थ भी एक बाधा हो सकती है।

आप स्क्रैप का एक प्रकार के बारे में बात कर रहे हैं - सेवा आप अनुरोधों की निश्चित सीमा के बाद ब्लॉक सकता है, तो आप प्रॉक्सी या एकाधिक आईपी बाइंडिंग का उपयोग करने की आवश्यकता है।

मेरे लिए, ज्यादातर मामलों में, मैं अजगर स्क्रिप्ट से अपने लैपटॉप पर 50-300 समवर्ती अनुरोध चला सकते हैं।

+0

पोल्स्चा के साथ सहमत हैं। अधिकांश समय, जब आप एक मनमानी सेवा के लिए HTTP अनुरोध कर रहे हैं, तो अधिकांश (घड़ी) समय व्यय नेटवर्क और रिमोट सेवा का जवाब देने की प्रतीक्षा में है। तो, कारण के भीतर, किसी भी पल के रूप में बेहतर धागे, उनमें से अधिकतर थ्रेड केवल प्रतीक्षा कतार में होंगे। सेवा थ्रॉटलिंग पर निश्चित रूप से पोल्स्चा के नोटों पर ध्यान दिया। – parselmouth

+0

धन्यवाद दोस्तों - सेवा वाणिज्यिक है और हम इसके लिए भुगतान कर रहे हैं। यह बहुत तेज़ है और बाधा नहीं होगी। इस मामले में, सबसे अच्छा विकल्प क्या होगा? – user1094786

+0

@ user1094786 इस मामले में केवल प्रत्येक चरण पर कई धागे के साथ अनुरोधों और प्रयोग की पाइपलाइन बनाने का प्रयास करें। बस कोशिश करें, जल्दी या बाद में आपको ऊपरी सीमा मिलेगी :-) –

0

Twisted के लिए एक उत्कृष्ट आवेदन की तरह लगता है। यहां कुछ web-related examples हैं, जिनमें download a web page शामिल हैं। database connections with Twisted पर एक संबंधित प्रश्न यहां दिया गया है।

ध्यान दें कि ट्विस्ट कई चीजों को एक साथ करने के लिए धागे पर भरोसा करता है। इसके बजाय, यह cooperative multitasking दृष्टिकोण लेता है --- आपकी मुख्य स्क्रिप्ट रिएक्टर शुरू करती है और रिएक्टर आपके द्वारा सेट किए गए कार्यों को कॉल करता है। रिएक्टर काम करना जारी रखने से पहले आपके कार्यों को रिएक्टर पर नियंत्रण वापस करना होगा।

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