2012-09-12 26 views
12

के अंदर मैं कुछ कार्यों कि सहभागी अजगर मॉड्यूल __import__आयात एक अजगर धागा

का उपयोग कर पायथन में एक लॉक विशेष रूप से आयात के लिए लोड मैं हाल ही में एक "आयात लॉक" के बारे में कुछ लेख पर ठोकर खाई, कि है, है (न सिर्फ जीआईएल)। लेकिन लेख पुराना था इसलिए शायद यह सच नहीं है।

इससे मुझे धागे में आयात करने की प्रैक्टिस के बारे में आश्चर्य होता है।

  1. import/__import__ धागा सुरक्षित हैं?
  2. क्या वे मृत ताले बना सकते हैं?
  3. क्या वे थ्रेडेड एप्लिकेशन में प्रदर्शन समस्याओं का कारण बन सकते हैं?

संपादित 12 Sept 2012

महान जबाब Soravux के लिए धन्यवाद। तो आयात थ्रेड सुरक्षित है, और मैं डेडलॉक्स के बारे में चिंता नहीं कर रहा हूं, क्योंकि मेरे कोड में __import__ का उपयोग करने वाले फ़ंक्शन एक-दूसरे को कॉल नहीं करते हैं।

क्या आपको पता है कि लॉक अधिग्रहण किया गया है भले ही मॉड्यूल पहले ही आयात हो चुका है? यदि ऐसा है, तो मुझे शायद यह देखने के लिए sys.modules में देखना चाहिए कि मॉड्यूल को पहले से ही __import__ पर कॉल करने से पहले आयात किया गया है या नहीं।

निश्चित रूप से यह सीपीथॉन में बहुत अंतर नहीं लेना चाहिए क्योंकि जीआईएल वैसे भी है। हालांकि यह अन्य कार्यान्वयन जैसे ज्योथन या स्टैकलेस पायथन पर बहुत अंतर डाल सकता है।

http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock

अजगर करता है, लेकिन, एक मॉड्यूल आयात ताला, जो द्वारा कार्यान्वित है परिभाषित:

संपादित 19 Sept 2012

Jython के बारे में, यहाँ वे दस्तावेज़ में क्या कहना है Jython। जब भी नाम का आयात किया जाता है तो यह लॉक अधिग्रहण किया जाता है। यह सच है कि आयात आयात कथन, समकक्ष __import__ अंतर्निहित, या संबंधित कोड के माध्यम से जाता है। यह ध्यान देने योग्य है कि यदि संबंधित मॉड्यूल पहले से ही आयात किया गया है, तो मॉड्यूल आयात लॉक अभी भी अधिग्रहित किया जाएगा, अगर केवल संक्षेप में।

तो ऐसा लगता है कि लॉक प्राप्त करने से बचने के लिए आयात करने से पहले sys.modules में जांच करना समझदारी होगी। तुम क्या सोचते हो?

+1

मैं कल्पना करता हूं कि उन्हें थ्रेड सुरक्षित होना चाहिए, क्योंकि आप कहते हैं, आयात पर दुभाषिया ब्लॉक। मुझे यह जानने में दिलचस्पी होगी कि क्या वे ठेठ गैर-थ्रेडेड सर्कुलर आयात के अलावा किसी भी तरह से डेडलॉक्स का कारण बन सकते हैं। –

उत्तर

8

सामान्य आयात थ्रेड सुरक्षित हैं क्योंकि वे निष्पादन से पहले एक आयात लॉक प्राप्त करते हैं और आयात करने के बाद इसे छोड़ देते हैं। यदि आप उपलब्ध हुक का उपयोग करके अपना खुद का कस्टम आयात जोड़ते हैं, तो इस लॉकिंग योजना को इसमें शामिल करना सुनिश्चित करें। पायथन में लॉकिंग सुविधाओं को imp मॉड्यूल (imp.lock_held()/acquire_lock()/release_lock()) द्वारा एक्सेस किया जा सकता है।

इस आयात लॉक का उपयोग करके already known पर परिपत्र निर्भरताओं से अलग कोई भी डेडलॉक्स या निर्भरता त्रुटियां नहीं बनेंगी।

लिनक्स पर clone होने पर थ्रेड बनाने के लिए निम्न-स्तरीय कॉल, पाइथन में थ्रेडिंग तब एक फोर्क-जैसे ऑपरेशन है। फोर्किंग और क्लोनिंग विभिन्न मेमोरी सेगमेंट पर विभिन्न व्यवहार लागू करता है। उदाहरण के लिए, केवल स्टैक को धागे से साझा नहीं किया जाता है, जो कि अधिक सेगमेंट (डेटा (अक्सर गाय), स्टैक, कोड, हीप) क्लोन की तुलना में, प्रभावी रूप से अपनी सामग्री साझा नहीं करते हैं। पायथन में आयात तंत्र वैश्विक नामस्थान का उपयोग करता है जो स्टैक पर रखा गया है, इस प्रकार अपने धागे के साथ एक साझा सेगमेंट का उपयोग कर रहा है। चूंकि साइड इफेक्ट्स (यानी स्मृति में परिवर्तन) एक ही सेगमेंट में काम आयात करने के बाद, यह एकल-थ्रेडेड प्रोग्राम के रूप में व्यवहार करता है। मल्टीथ्रेड प्रोग्राम पर आपके आयात में थ्रेड सुरक्षित पुस्तकालयों का उपयोग करने के लिए सावधान रहें, हालांकि। यह मेहेम ऐसे कार्यों में कॉल का उपयोग करने का कारण बनता है जो ऐसे वातावरण में थ्रेड सुरक्षित नहीं हैं।

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

आपके संपादन का जवाब देने के लिए: आयातित मॉड्यूल सभी पाइथन द्वारा कैश किए जाते हैं। यदि मॉड्यूल पहले ही कैश में लोड हो चुका है, तो इसे फिर से नहीं चलाया जाएगा और आयात कथन (या फ़ंक्शन) तुरंत वापस आ जाएगा। आपको sys.modules में कैश लुकअप को लागू करने की आवश्यकता नहीं है, पाइथन आपके लिए करता है और imp sys.modules लुकअप के लिए जीआईएल से अलग कुछ भी नहीं लॉक करेगा।

अपने दूसरे संपादन का उत्तर देने के लिए: मैं उपयोग की जाने वाली पुस्तकालयों (इस मामले में, मानक पुस्तकालय) में कॉल को अनुकूलित करने की कोशिश करने से एक सरल कोड बनाए रखना पसंद करता हूं। तर्क यह है कि कुछ करने के लिए आवश्यक समय आमतौर पर मॉड्यूल आयात करने के लिए आवश्यक समय से अधिक महत्वपूर्ण है। इसके अलावा, पूरे परियोजना में इस तरह के कोड को बनाए रखने के लिए आवश्यक समय निष्पादित करने के समय से अधिक है। यह सब नीचे उबलता है: "प्रोग्रामर समय CPU समय से अधिक मूल्यवान है"।

+0

महान उत्तर के लिए धन्यवाद। अब मैं सोच रहा हूं कि आयात लॉक तब हासिल किया जाता है जब एक मॉड्यूल पहले आयात किया गया था (मेरे मूल प्रश्न में संपादन देखें)। –

+0

आपके संपादित प्रश्न को दर्शाने के लिए संपादित उत्तर। अन्य पायथन स्वाद के बारे में अच्छा बिंदु। – Soravux

+1

मैंने प्रलेखन के इस हिस्से में ठोकर खाई: http://docs.python.org/library/threading.html#importing-in-threaded-code, जो कुछ और पहलुओं को नामित करता है। – Alfe

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