2010-06-04 4 views
8

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

उत्तर

5

हमेशा multiprocessing पर एक नज़र डालें।

+0

ट्विस्ट और मल्टीप्रोसेसिंग के बीच, जो सर्वोत्तम प्रदर्शन लाभ प्रदान करने जा रहा है? – Rhubarb

+0

ट्विस्ट विशेष रूप से नेटवर्किंग के लिए सबसे उपयुक्त है; यदि आप एसिंच नेटवर्क प्रोग्रामिंग की जटिलताओं के लिए उपयोग नहीं करते हैं तो मल्टीप्रोसेसिंग अधिक सरल है। – Amber

15

मल्टीथ्रेडिंग नेट पर I/O को तेज करने के विशिष्ट उद्देश्य के लिए ठीक है (हालांकि असीमित प्रोग्रामिंग भी अधिक प्रदर्शन प्रदान करेगी)। सीपीथन की मल्टीथ्रेडिंग काफी "सच" (मूल ओएस धागे) है - जो आप शायद सोच रहे हैं वह जीआईएल है, वैश्विक दुभाषिया ताला जो एक साथ पाइथन कोड चलाने से अलग धागे को रोकता है। लेकिन सभी आई/ओ प्राइमेटिव जीआईएल छोड़ते हैं, जबकि वे सिस्टम कॉल को पूरा करने की प्रतीक्षा कर रहे हैं, इसलिए जीआईएल आई/ओ प्रदर्शन पर प्रासंगिक नहीं है!

असीमित प्रोग्रामिंग के लिए, twisted के आसपास सबसे शक्तिशाली ढांचा twisted है, लेकिन यदि आप ऐसा प्रोग्रामिंग कभी नहीं कर चुके हैं तो इसमें लटका पाने में कुछ समय लग सकता है। थ्रेड के पूल के उपयोग के माध्यम से अतिरिक्त I/O प्रदर्शन प्राप्त करना शायद आपके लिए आसान होगा।

3

क्या ऐसा करने का एक बेहतर तरीका है?

हाँ

मैं मैं के बाद से एक से अधिक थ्रेड शुरू करने की सोच रहा था/ओ बाध्य संचालन

मत करो।

ओएस स्तर पर, प्रक्रिया में सभी थ्रेड I/O संसाधनों का सीमित सेट साझा कर रहे हैं।

यदि आप वास्तविक गति चाहते हैं, तो आपके प्लेटफॉर्म को सहन करने के रूप में कई हेवीवेट ओएस प्रक्रियाओं को जन्म दें। ओएस वास्तव में, प्रक्रियाओं के बीच I/O वर्कलोड को संतुलित करने के बारे में वास्तव में अच्छा है। इसे ओएस को सॉर्ट करें।

लोग कहेंगे कि 3000 प्रक्रियाओं को फैलाना बुरा है, और वे सही हैं। आप शायद एक समय में केवल कुछ सौ बनाना चाहते हैं।

आप वास्तव में निम्नलिखित चाहते हैं।

  1. एक साझा संदेश कतार जिसमें 3000 यूआरआई कतारबद्ध हैं।

  2. कुछ सौ श्रमिक जो कतार से पढ़ रहे हैं।

    प्रत्येक कार्यकर्ता को कतार से यूआरआई मिलती है और फ़ाइल मिलती है।

कर्मचारी चल रहे रह सकते हैं। जब कतार खाली है, तो वे बस काम पर इंतजार कर बैठे रहेंगे।

"हर कुछ मिनट" आप 3000 यूआरआई को कतार में डंप करने के लिए श्रमिकों को काम करना शुरू कर देते हैं।

यह आपके प्रोसेसर पर हर संसाधन को जोड़ देगा, और यह काफी छोटा है। प्रत्येक कार्यकर्ता कोड की केवल कुछ पंक्तियां हैं। कतार लोड करना एक विशेष "प्रबंधक" है जो कोड की कुछ पंक्तियां भी है।

+0

श्रमिक (जो अलग प्रक्रियाएं हैं) इस वैश्विक कतार को साझा करने में सक्षम कैसे हैं, जो संभावित रूप से अपनी प्रक्रिया में बैठता है? उदाहरण के लिए –

+0

http://pypi.python.org/pypi/celery/। http://www.darkcoding.net/software/choosing-a-message-queue-for-python-on-ubuntu-on-a-vps/ http://stackoverflow.com/questions/1336489/job-queue- कार्यान्वयन के लिए अजगर –

0

Gevent इसके लिए एकदम सही है।

Greenlets की Gevent के उपयोग (एक ही अजगर प्रक्रिया में हल्के coroutines) आप अतुल्यकालिक संचालन कोड पठनीयता समझौता करने या अपने मिश्रण में सार 'रिएक्टर' अवधारणाओं को शुरू करने के बिना प्रदान करते हैं।

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