2009-07-26 9 views
7

पर विचार करें:पायथन: os.pipe() oswrite() os.pipe() थ्रेडसेफ पर है?

pipe_read, pipe_write = os.pipe() 

अब, मैं दो बातें जानना चाहते हैं:

(1) मैं दो धागे की है। अगर मैं गारंटी देता हूं कि केवल os.read(pipe_read,n) पढ़ रहा है और दूसरा केवल os.write(pipe_write) लिख रहा है, तो क्या मुझे कोई समस्या होगी, भले ही दोनों धागे इसे एक साथ करते हैं? क्या मुझे सही डेटा में लिखा गया सभी डेटा मिल जाएगा? क्या होता है अगर वे इसे एक साथ करते हैं? क्या यह संभव है कि एक ही लिखने टुकड़ों में पढ़ा जाता है, ?:

Thread 1: os.write(pipe_write, '1234567') 
Thread 2: os.read(pipe_read,big_number) --> '123' 
Thread 2: os.read(pipe_read,big_number) --> '4567' 

या जैसे - फिर से, समकालीनता पर विचार - एक ही os.write(some_string) हमेशा एक ही os.read(pipe_read, very_big_number) द्वारा पूरी तरह से वापस आ जाएगी?

(2) पर विचार एक से अधिक धागा logging.handlers.FileHandler() का उपयोग कर पाइप के pipe_write अंत करने के लिए लिख - मैं पढ़ा है कि लॉगिंग मॉड्यूल threadsafe है। क्या इसका मतलब यह है कि मैं डेटा खोए बिना ऐसा कर सकता हूं? मुझे लगता है कि मैं पाइप में डेटा के क्रम को नियंत्रित करने में सक्षम नहीं होगा; लेकिन यह एक आवश्यकता नहीं है। आवश्यकताएँ: लिखने अंत पर कुछ धागे द्वारा लिखित

  • सभी डेटा पढ़ अंत
  • एक स्ट्रिंग एक भी logger.info(), logger.error(), ... द्वारा लिखित एक टुकड़ा में रहने के लिए है पर बाहर आना चाहिए।

क्या ये रिकॉर्ड्स पूर्ण हैं?

अग्रिम धन्यवाद,

जनवरी-फिलिप Gehrcke

+0

बीटीडब्ल्यू: मुझे 'Queue.Queue() 'और' select.select() 'के बारे में पता है। मेरे विशेष मामले में, थ्रेड ए से थ्रेड बी का संचार 'Queue.Queue() 'के माध्यम से होगा: यह" आदेश "को स्थानांतरित करता है। इसके विपरीत, बी-> ए लॉग संदेशों को परिवहन करेगा और ऊपर वर्णित 'os.pipe()' के माध्यम से महसूस किया जाना चाहिए, क्योंकि थ्रेड ए ने पहले ही 'चयन' के आधार पर एक ईवेंट लूप लागू किया है।चुनें() ', जो 'pipe_read' की निगरानी कर सकता है और कुछ पठनीय होने पर कॉलबैक फ़ंक्शन का आह्वान कर सकता है। –

उत्तर

8

os.read और os.write दो एफडी पर os.pipe से लौटे threadsafe है, लेकिन आपको लगता है कि यह मांग करना ज्यादा दिखाई देते हैं। उप (1), हां, साइनले पढ़ने या लिखने के लिए कोई "परमाणु" गारंटी नहीं है - जो परिदृश्य आप चित्रित करते हैं (एक छोटा सा लेखन दो पाठों का उत्पादन समाप्त होता है) पूरी तरह से संभव है। (सामान्य रूप से, ओह जो भी ऑपरेटिंग सिस्टम कार्यक्षमता पर एक पतला आवरण है, और यह सुनिश्चित करने के लिए ओएस पर निर्भर करता है, या यह सुनिश्चित करने में विफल रहता है कि आपको किस तरह की कार्यक्षमता की आवश्यकता है; इस मामले में, पॉज़िक्स मानक को ओएस की आवश्यकता नहीं है इस तरह की "परमाणुता" सुनिश्चित करने के लिए)। आपको लिखे गए सभी डेटा, और सही क्रम में प्राप्त करने की गारंटी है, लेकिन यह है। एक बार जब यह ओएस-सप्लाई बफर भर जाता है तो डेटा के एक बड़े टुकड़े का एक भी लिखना बंद हो सकता है और केवल कुछ ही थ्रेड कुछ प्रारंभिक डेटा (सावधानी बरतें, बेशक!) इत्यादि को पढ़ते हैं, तो आगे बढ़ें

उप (2), हां, लॉगिंग मॉड्यूल लॉगिंग.info, logging.warn, logging.error, आदि के लिए एक कॉल द्वारा उत्पादित उस डेटा में थ्रेडसेफ और "परमाणु" है, अंतर्निहित कॉल के संदर्भ में "एक टुकड़े में रहता है" हैंडलर (हालांकि यदि उस हैंडलर बदले में गैर-परमाणु साधनों का उपयोग करता है जैसे ओ.स्राइट, यह अभी भी कर्नेल में स्टॉल कर सकता है जब तक अंतर्निहित बफर को उपरोक्त के रूप में अनजान नहीं किया जाता है)।

+1

इस उत्तर के लिए आपको बहुत बहुत धन्यवाद। "आपको लिखे गए सभी डेटा प्राप्त करने की गारंटी है, और सही क्रम में, लेकिन यह है" -> मुझे बस इतना ही चाहिए, क्योंकि इसका मतलब है कि मैं कटा हुआ डेटा को एक छोटे से पोस्ट-एस्ड द्वारा पुनः इकट्ठा कर सकता हूं () दिनचर्या। अब मैं स्पष्ट विवेक के साथ कोडिंग शुरू कर सकता हूं। धन्यवाद, फिर से :-) –

+0

आपका स्वागत है! आप पुनः पोस्टिंग प्रसंस्करण को आसान बनाने के लिए प्रत्येक 'लिखने' की शुरुआत में एक विशिष्ट मार्कर का उपयोग कर सकते हैं। –

+0

कुछ अपडेट: दरअसल, मुझे 'फाइलहैंडलर() 'के बजाय लॉगिंग के' स्ट्रीमहैंडलर() 'का उपयोग करना होगा। पायथन डॉक्स से: 'StreamHandler() '" लॉगिंग आउटपुट भेजता है [...] किसी फ़ाइल-जैसी ऑब्जेक्ट (या, अधिक सटीक, कोई ऑब्जेक्ट जो' लिखने() 'और' फ्लश() 'विधियों का समर्थन करता है)। इसलिए , मुझे लिखने के लिए 'os.fdopen()' के साथ 'pipe_write' लपेटना है- और फ्लश विधियों: 'लॉगिंग। स्ट्रीमहैंडलर (os.fdopen (पाइप_write,' a ', 0))' मुझे आशा है कि मैंने कोई बफरिंग और एपेंड मोड के साथ अच्छे विकल्प चुने हैं। –