2016-04-07 8 views
6

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

क्या कोई यह बता सकता है कि क्यों और कैसे मैं यह पता लगा सकता हूं कि मेरा (शायद काफी संख्यात्मक-भारी) कोड बहुप्रचार के लिए उपयुक्त होगा?

उत्तर

11

कई numpy गणना जीआईएल द्वारा अप्रभावित हैं, लेकिन सभी नहीं।

कोड में जबकि पाइथन दुभाषिया (उदाहरण के लिए सी पुस्तकालय) की आवश्यकता नहीं है, विशेष रूप से जीआईएल को छोड़ना संभव है - अन्य कोड को अनुमति देना जारी रखने के लिए दुभाषिया पर निर्भर करता है। Numpy सी कोडबेस में मैक्रोज़ NPY_BEGIN_THREADS और NPY_END_THREADS का उपयोग जीआईएल रिलीज की अनुमति देने वाले कोड के ब्लॉक को सीमित करने के लिए किया जाता है। आप इन्हें this search of the numpy source में देख सकते हैं।

NumPy C API documentation में थ्रेडिंग समर्थन पर अधिक जानकारी है। अतिरिक्त मैक्रोज़ NPY_BEGIN_THREADS_DESCR, NPY_END_THREADS_DESCR और NPY_BEGIN_THREADS_THRESHOLDED पर ध्यान दें जो सशर्त जीआईएल रिलीज को संभालते हैं, जो dtypes और लूप के आकार पर निर्भर करता है।

सबसे प्रमुख कार्यों को जारी जीआईएल - उदाहरण के Universal Functions (ufunc) के लिए बहुत as described कार्य करें:

जब तक कोई वस्तु सरणियों शामिल कर रहे हैं, अजगर वैश्विक दुभाषिया लॉक (जीआईएल) छोरों बुला से पहले जारी किया गया है। त्रुटि शर्तों को संभालने के लिए आवश्यक होने पर इसे फिर से अधिग्रहित किया जाता है।

अपने कोड के संबंध में, source code for NumPy is available। उपरोक्त मैक्रोज़ के लिए आपके द्वारा उपयोग किए जाने वाले कार्यों (और वे जिन्हें वे कॉल करते हैं) देखें। ध्यान दें कि प्रदर्शन लाभ पर बहुत निर्भर है कि जीआईएल जारी किया गया है - यदि आपका कोड लगातार पाइथन में/बाहर निकल रहा है तो आपको अधिक सुधार दिखाई नहीं देगा।

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

numpy उपलब्ध on the official wiki के साथ समांतर प्रसंस्करण पर कुछ अतिरिक्त जानकारी है और सामान्य over on Programmers.SE में पाइथन जीआईएल के बारे में उपयोगी पोस्ट है।

+1

धन्यवाद, यह वास्तव में उपयोगी उत्तर है! – Lisa

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