2013-02-20 41 views
5

मैं सिर्फ इस नए कार्यान्वयन के बारे में खोज रहा था, और मैं अजगर 2.7 का उपयोग करता हूं, मुझे this इंस्टॉल करना होगा, इसलिए यदि मैं इसका उपयोग करता हूं, तो मैं सीपीआईथन पर जीआईएल शब्द भूल जाऊंगा?समवर्ती है। जीआईएल की दवा है?

+1

http://www.dalkescientific.com/writings/diary/archive/2012/01/19/concurrent.futures.html –

+1

http://docs.python.org/dev/library/concurrent.futures.html # मॉड्यूल-समवर्ती। फ्यूचर्स - जीआईएल के बारे में कुछ भी उल्लेख नहीं करता है, इसलिए इसका उपयोग धागे स्पष्ट रूप से सच धागे हैं। अन्यथा, इस सभी हुलाबुलू से परेशान क्यों? –

+0

मुझे पता चला है कि एसिंक्रोनस कोड समवर्ती.फ्यूचर का उपयोग करना पसंद करता है, इसलिए मैंने कहा कि यह जीआईएल –

उत्तर

12

नहीं, concurrent.futures में जीआईएल के साथ लगभग कुछ भी नहीं है।

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

futures मॉड्यूल केवल आपके अनुसूची और सीधे threading या multiprocessing का उपयोग करने से कार्यों पर प्रतीक्षा करने के लिए एक सरल तरीका देता है। और इसमें अतिरिक्त लाभ है कि आप future कोड को बदले बिना थ्रेड पूल और एक प्रोसेस पूल (और यहां तक ​​कि एक ग्रीनलेट लूप, या कुछ पागल और आविष्कार कर सकते हैं) के बीच स्वैप कर सकते हैं। इसलिए, यदि आपको नहीं पता कि आपके कोड में जीआईएल की समस्याएं होंगी, तो आप इसे थ्रेड का उपयोग करने के लिए बना सकते हैं, और फिर इसे एक-लाइन परिवर्तन के साथ प्रक्रियाओं का उपयोग करने के लिए स्विच कर सकते हैं, जो कि बहुत अच्छा है।

लेकिन, यदि आप ThreadPoolExecutor का उपयोग करते हैं, तो इसमें सटीक जीआईएल मुद्दे होंगे जैसे कि आपने threading और queue के साथ मैन्युअल रूप से थ्रेड पूल, कार्य कतार आदि बनाया है। यदि आप ProcessPoolExecutor का उपयोग करते हैं, तो यह उसी तरह से जीआईएल मुद्दों से बच जाएगा (और उसी ट्रेडऑफ के साथ) जैसे कि आपने मैन्युअल रूप से multiprocessing का उपयोग किया था।

और पीईपीआई पैकेज 3.212 से 2.x (और 3.0-3.1) से concurrent.futures मॉड्यूल का एक साधारण बैकपोर्ट है। (यह जादुई आप नए और तरह-ऑफ-द बेहतर 3.2 जीआईएल, या अधिक-सुधार 3.3 जीआईएल देना नहीं है बहुत कम जीआईएल को हटा दें।)


मैं शायद भी नहीं होना चाहिए जीआईएल में बदलावों का उल्लेख किया गया है, क्योंकि ऐसा लगता है कि इसमें भ्रम जोड़ा गया है ... लेकिन अब, मुझे बहुत अधिक विस्तार से इसे सीधे करने की कोशिश करें।

यदि आपके पास आईओ-बाध्य काम के अलावा कुछ भी नहीं है, तो उचित सीमा तक समरूपता प्राप्त करने के लिए धागे एक शानदार तरीका हैं। और 3.3 उन्हें और भी बेहतर काम करता है- लेकिन ज्यादातर मामलों के लिए, 2.7 पहले से ही काफी अच्छा है, और, ज्यादातर मामलों में जहां यह नहीं है, 3.3 अभी भी पर्याप्त नहीं है। यदि आप 10000 एक साथ ग्राहकों को संभालना चाहते हैं, तो आप थ्रेड के बजाय इवेंट लूप (उदा।, twisted, tornado, gevent, tulip इत्यादि) का उपयोग करना चाहते हैं।

यदि आपके पास कोई सीपीयू-बाध्य काम है, तो धागे उस काम को समानांतर करने में मदद नहीं करते हैं। वास्तव में, वे चीजों को और खराब बनाते हैं। 3.3 उस दंड को इतना बुरा नहीं बनाता है, लेकिन यह अभी भी जुर्माना है, और आपको अभी भी ऐसा नहीं करना चाहिए। यदि आप सीपीयू काम को समानांतर करना चाहते हैं, तो आपको प्रक्रियाओं का उपयोग करना होगा, धागे नहीं। 3.3 का एकमात्र लाभ यह है कि futuresmultiprocessing से उपयोग करने में थोड़ा आसान है, और इसे इंस्टॉल करने की आवश्यकता के बजाय अंतर्निहित आता है।

मैं आपको 3.3 पर जाने से हतोत्साहित नहीं करना चाहता, क्योंकि यह 2.7 से बेहतर भाषा का बेहतर कार्यान्वयन है। लेकिन बेहतर सहमति एक स्थानांतरित करने का कारण नहीं है।

+0

तो वे अलग-अलग चीजें हैं! यह था कि जीआईएल 3.2 पर फिर से लिखा गया था कि मुझे लगता है कि यह समवर्ती है। फ्यूचर्स जो समस्या हल करता है, धन्यवाद :) –

+2

@AbdelouahabPp: नहीं, 'concurrent.futures' बनाने की समस्या को छोड़कर, किसी भी समस्या को हल नहीं करता है समवर्ती कोड लिखने के लिए थोड़ा आसान है। 3.2 और 3.3 में जीआईएल में परिवर्तन पूरी तरह से स्वतंत्र हैं, और यह सिर्फ एक संयोग है कि एक दशक से पहले का पहला महत्वपूर्ण जीआईएल परिवर्तन पायथन के समान संस्करण में 'वायदा' पुस्तकालय के रूप में आया था। – abarnert

+0

तो मुझे उत्कृष्ट समवर्ती कोड प्राप्त करना चाहते हैं तो मुझे 3.3 पर स्विच करना चाहिए! धन्यवाद :) और मुझे खेद है क्योंकि यह धागा मैं इसके बारे में अधिक जानकारी प्राप्त करने के लिए सीररल के समय वापस आऊंगा, एक नौसिखिया हूं, और इस पुस्तकालय को टोरनाडो –