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