2011-01-05 25 views
5

पर चर्चा करने के लिए पाइथन में कौन से फ़ंक्शन पुन: प्रवेश कर रहे हैं Signal handlers and logging in Python चर्चा जो कि पायथन में फिर से प्रवेश करने वाले प्रश्न मेरे दिमाग में आए हैं।सिग्नल लाइब्रेरी प्रसंस्करण

signal library उल्लेख:

हालांकि अजगर संकेत संचालकों एसिंक्रोनस रूप से जहाँ तक अजगर उपयोगकर्ता का संबंध है कहा जाता है, वे केवल अजगर दुभाषिया के परमाणु निर्देश के बीच हो सकता है। इसका मतलब यह है कि लंबी गणनाओं के दौरान पहुंचने वाले संकेत सी में पूरी तरह कार्यान्वित किया गया है (जैसे बड़े टेक्स्ट के निकायों पर नियमित अभिव्यक्ति मिलान) मनमाने ढंग से समय के लिए देरी हो सकती है।

फिर से प्रवेश द्वार है कि ठेठ द्वारा को दिखाया गया है नहीं है logging library:

आप संकेत मॉड्यूल का उपयोग कर अतुल्यकालिक संकेत संचालकों को कार्यान्वित कर रहे हैं, तो आप से लॉगिंग उपयोग करने के लिए सक्षम नहीं हो सकता ऐसे हैंडलर के भीतर। ऐसा इसलिए है क्योंकि थ्रेड कार्यान्वयन थ्रेडिंग मॉड्यूल में हमेशा पुन: प्रवेश नहीं होता है, और इसलिए ऐसे सिग्नल हैंडलर से को नहीं बुलाया जा सकता है।

मैं थोड़ा उलझन में हूं क्योंकि सिग्नल लाइब्रेरी जीआईएल (ग्लोबल दुभाषिया ताला) के बारे में "परमाणु निर्देशों के बीच .." के बारे में बात करती है। इस मामले में संकेतों को स्थगित कर दिया जाता है और जैसे ही जीआईएल छोड़ा जाता है/अनलॉक। सिग्नल कतार का एक प्रकार।

समझ में आता है कि लेकिन यह करता है, तो कार्य करता है जो स्थगित कर दिया संकेत हैंडलर द्वारा कहा जाता है कर रहे हैं फिर से प्रवेशी कोई फर्क नहीं पड़ता, क्योंकि वे "फिर से प्रवेशी" -limitation साथ असली POSIX संकेत हैंडलर के भीतर बुलाया नहीं कर रहे हैं:

केवल POSIX सी कार्यों की निर्धारित सूची फिर से प्रवेशी के रूप में घोषित कर रहे हैं और एक POSIX संकेत हैंडलर के भीतर बुलाया जा सकता है। आईईईई स्टडी 1003.1 सूचियां 118 पुन: प्रवेश करने वाले यूनिक्स फ़ंक्शन आपको https://www.opengroup.org/ पर देखें (लॉगिन आवश्यक)।

उत्तर

2

मुझे विश्वास है कि क्या प्रवेश मॉड्यूल गैर रैत्रांत बनाता है कि यह एक threading.Lock का उपयोग करता है (एक RLock के बजाय) कई सूत्र एक ही संचालकों (ताकि संदेशों interweaved नहीं मिलता है) करने के लिए लॉग इन करने सिंक्रनाइज़ करने के लिए है।

इसका मतलब है कि अगर एक लॉकिंग कॉल जो लॉक प्राप्त कर लेता है, सिग्नल हैंडलर द्वारा बाधित होता है और सिग्नल हैंडलर लॉग इन करने का प्रयास करता है तो इसे जारी होने के लिए पिछले acquire के लिए हमेशा के लिए प्रतीक्षा कर दिया जाएगा।

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

+0

मैंने पायथन 2.7.1 रिलीज की जांच की है और आपकी धारणा गलत है।Http://svn.python.org/view/python/tags/r271/Lib/logging/__init__.py?revision=86833&view=markup –

+0

में '_acquireLock() 'फ़ंक्शन देखें, मैं सही हूं, यह वास्तव में' RLock'। इसे खोदने के लिए धन्यवाद। हालांकि, दस्तावेज़ों के अनुसार, कार्यान्वयन हमेशा पुन: प्रवेश नहीं किया जा सकता है: "ऐसा इसलिए है क्योंकि थ्रेडिंग मॉड्यूल में लॉक कार्यान्वयन हमेशा पुनः प्रवेश नहीं होते हैं" (http://docs.python.org/library/logging.html # थ्रेड-सुरक्षा) – albertov

+0

मैंने अपने प्रश्न में यही बताया है। हम गर्मी कर सकते हैं कि थ्रेडिंग लाइब्रेरी का उपयोग करने वाले प्रत्येक मॉड्यूल को * असली * पॉज़िक्स सिग्नल हैंडलर में उपयोग करने के अर्थ में पुन: प्रवेश नहीं किया जाता है। लेकिन पाइथन स्थगित सिग्नल प्रोसेसिंग नहीं करता है? –

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