2010-06-10 16 views
5

मुझे भारी I/O बाध्य ऑपरेशन करना पड़ा, यानी बड़ी फ़ाइलों को पार्स करना और एक प्रारूप से दूसरे प्रारूप में परिवर्तित करना। शुरुआत में मैं इसे क्रमशः करता था, यानी एक के बाद एक पार्सिंग ..! प्रदर्शन बहुत खराब था (इसमें 90+ सेकेंड लगते थे)। तो मैंने प्रदर्शन में सुधार के लिए थ्रेडिंग का उपयोग करने का फैसला किया। मैंने प्रत्येक फाइल के लिए एक धागा बनाया है। (4 धागे)पायथन थ्रेडिंग और प्रदर्शन?

for file in file_list: 
      t=threading.Thread(target = self.convertfile,args = file) 
      t.start() 
      ts.append(t) 
for t in ts: 
      t.join() 

लेकिन मेरे विस्मय के लिए, कोई प्रदर्शन सुधार नहीं है। अब कार्य को पूरा करने में लगभग 9 0+ सेकंड लगते हैं। चूंकि यह I/O बाध्य संचालन है, इसलिए मैंने प्रदर्शन में सुधार करने की उम्मीद की थी।

उत्तर

10

सामान्य पायथन दुभाषिया के तहत, global interpreter lock (उर्फ जीआईएल) की वजह से थ्रेडिंग आपके प्रोग्राम में अधिक CPU कोर आवंटित नहीं करेगा।

multiprocessing मॉड्यूल यहां आपकी सहायता कर सकता है। (ध्यान दें कि इसे पायथन 2.6 में पेश किया गया था, लेकिन पाइथन 2.5 के लिए बैकपोर्ट मौजूद हैं।)

जैसा कि एमएसल्टर्स कहते हैं, यदि आपका प्रोग्राम I/O बाध्य है तो यह बहस योग्य है या नहीं।

import multiprocessing 

MAX_PARALLEL_TASKS = 8 # I have an Intel Core i7 :) 

pool = multiprocessing.Pool(MAX_PARALLEL_TASKS) 

pool.map_async(convertfile, filelist) 

pool.close() 
pool.join() 

महत्वपूर्ण: लेकिन यह एक शॉट :)

आपने इस मॉड्यूल का उपयोग कर करना चाहते हैं प्राप्त करने के लिए लायक हो सकता है! जो कार्य आप map_async पर भेजते हैं वह अचारनीय होना चाहिए। आम तौर पर, उदाहरण विधियां अस्थिर नहीं होती हैं जब तक कि आप उन्हें ऐसा करने के लिए इंजीनियरिंग नहीं करते! ध्यान दें कि ऊपर convertfile एक फ़ंक्शन है।

यदि आपको वास्तव में convertfile से परिणाम प्राप्त करने की आवश्यकता है, तो इसके साथ-साथ ऐसा करने के तरीके भी हैं। मल्टीप्रोसेसिंग दस्तावेज़ पृष्ठ पर उदाहरणों को स्पष्ट करना चाहिए।

+0

धन्यवाद delty..लेकिन मल्टीप्रोसेसिंग मॉड्यूल की अपनी समस्याएं हैं। 1) मुझे अपने कोड को दोबारा प्रतिक्रिया देना है क्योंकि मैं इंस्टेंस विधियों का उपयोग नहीं कर सकता .. 2) मेरे पास एक इंस्टेंस विधि है जिसमें कई फाइल हैंडलर हैं .. फ़ाइल प्रक्रियाओं में फ़ाइल हैंडलर बंद हैं जो स्वीकार्य नहीं हैं। तो मुझे उन्हें फिर से खोलने की जरूरत है। दुर्भाग्यवश मेरे पास उन्हें जानने का कोई तरीका नहीं है क्योंकि ये तत्काल – kumar

+0

के दौरान पारित किए गए हैं, यह एक अलग प्रक्रिया में निष्पादित फ़ंक्शन स्वयं नहीं होना चाहिए। क्या आप अलग प्रक्रियाओं में तत्काल भाग कर सकते हैं? उदाहरण के लिए। एक फ़ंक्शन या यहां तक ​​कि एक अलग स्क्रिप्ट लिखें जो एकल तात्कालिकता और रूपांतरण करता है; फिर एक "मास्टर स्क्रिप्ट" लिखें जो इन कार्यों को चलाने के लिए मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करता है। अलग-अलग स्क्रिप्ट [subprocess] (http://docs.python.org/library/subprocess.html) मॉड्यूल का उपयोग करके चलाया जा सकता है। यदि बहुत सारे साझा डेटा हैं, तो हां, यही वह जगह है जहां मल्टीप्रोसेसिंग जटिल हो जाती है। लेकिन उस मॉड्यूल में बहुत सारे टूल्स हैं :) – detly

2

थ्रेडिंग ओएस को आपके प्रोग्राम में अधिक CPU कोर आवंटित करने की अनुमति देता है। यदि यह I/O बाध्य है, तो इसका मतलब है कि गति को CPU गति की बजाय I/O संदिग्ध गति से सीमित किया गया था। उन मामलों में, अधिक CPU कोर आवंटित करने में जरूरी मदद नहीं होती है - आप अभी भी I/O उपप्रणाली पर प्रतीक्षा कर रहे हैं।

+0

लेकिन मेरा मानना ​​है कि थ्रेड स्विचिंग तब होती है जब थ्रेड I/o subsyetm की प्रतीक्षा कर रहा है, है ना? तो मैं अब समानांतर चीजें कर रहा हूं जिसका मतलब है कि मैं कुछ प्रदर्शन सुधार की उम्मीद कर सकता हूं ?? – kumar

+5

पायथन में थ्रेडिंग प्रोग्राम में अधिक CPU कोर आवंटित नहीं करता है। – detly

+0

@ कुमार: जैसा कि प्रतिक्रिया कहती है, यदि आप I/O बाध्य हैं - आपका I/O उतना कठिन हो रहा है जितना यह कर सकता है - अधिक CPU समय या समांतर प्रसंस्करण I/O को किसी भी पहले खत्म नहीं करने जा रहा है। – Josh

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