2008-11-25 15 views
20

क्या Python में फ़ाइल को असीमित रूप से लिखने का कोई आसान तरीका है?पाइथन में असीमित फ़ाइल लेखन संभव है?

मैं जानता हूँ कि file io that comes with Python ब्लॉक कर रहा है; जो ज्यादातर मामलों में ठीक है। इस विशेष मामले के लिए, मुझे लिखना चाहिए कि आवेदन को अवरुद्ध न करें, या कम से कम जितना संभव हो उतना कम से कम।

उत्तर

3

मुड़ non-blocking writes on file descriptors है। यदि आप एसिंक कोड लिख रहे हैं, तो मैं उम्मीद करता हूं कि आप मोड़ का उपयोग कर रहे हों, वैसे भी। :)

+10

दुःख की बात है O_NONBLOCK (जो क्या fdesc एपीआई आप लिंक वास्तव में करता है) के साथ काम नहीं करता है स्थानीय हार्ड डिस्क फाइलें। यानी, पॉज़िक्स स्पेक का कहना है कि इसे अनदेखा किया जाना चाहिए और मुझे पता है कि प्रत्येक यूनिक्स सिस्टम पर इसे कड़ाई से अनदेखा किया गया है। यदि आपको लगता है कि यह एक बेवकूफ विचार है, तो मैं अधिक सहमत नहीं हो सकता था, लेकिन ऐसा कई ऐतिहासिक और कार्यान्वयन कारण हैं। संक्षेप में, यदि आप स्थानीय हार्ड डिस्क फ़ाइलों के लिए एसिंक्रोनस आईओ चाहते हैं, तो आप बेहतर थ्रेड का उपयोग करते हैं और आईओ थ्रेड में आईओ को स्थगित करते हैं या एआईओ एपीआई का उपयोग करते हैं। – mathieu

17

मैं चीजों, अतुल्यकालिक मैं समझता हूँ के रूप में/ओ नहीं गैर अवरुद्ध I/O के रूप में काफी एक ही है।

के मामले में गैर-अवरुद्ध I/सेटअप हे, एक बार एक फ़ाइल की जानकारी देता है होना करने के लिए "गैर अवरुद्ध", एक read() सिस्टम कॉल (उदाहरण के लिए) EWOULDBLOCK (या EAGAIN) वापस आ जाएगी अगर पढ़ा आपरेशन को ब्लॉक कर देगा ऑपरेशन को पूरा करने के लिए कॉलिंग प्रक्रिया। सिस्टम select(), poll(), epoll() इत्यादि को प्रदान किया जाता है ताकि प्रक्रिया ओएस से कहा जा सके कि एक या अधिक फ़ाइल डिस्क्रिप्टर उपलब्ध हैं कुछ I/O ऑपरेशन करने के लिए।

अतुल्यकालिक मैं/हे फ़ाइल वर्णनकर्ता के लिए आई/ओ के लिए एक अनुरोध कतार द्वारा संचालित होता है, फोन करने की प्रक्रिया के स्वतंत्र रूप से ट्रैक। फ़ाइल डिस्क्रिप्टर जो एसिंक्रोनस I/O (कच्चे डिस्क देवताओं को आम तौर पर) का समर्थन करता है, एक प्रक्रिया aio_read() (उदाहरण के लिए) को कॉल करने के लिए फ़ाइल डिस्क्रिप्टर से कई बाइट्स को पढ़ने का अनुरोध करने के लिए कॉल कर सकती है। सिस्टम कॉल तुरंत लौटाता है, चाहे I/O पूरा हो गया हो या नहीं। कुछ समय बाद, प्रक्रिया I/O (यानी, बफर डेटा से भरा हुआ है) पूरा करने के लिए के लिए ऑपरेटिंग सिस्टम का चुनाव करती है।

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

इसी के साथ

, वहाँ POSIX aio_read के लिए किसी भी रैपर हैं/अजगर के लिए आदि सिस्टम कॉल बारे में?

+0

एक बात जोड़ने के लिए: जैसा कि पहली प्रतिक्रिया पर टिप्पणीकर्ता कहता है, फाइलों पर वास्तव में कोई सिस्टम O_NONBLOCK का पालन नहीं करता है - यह वास्तव में केवल सॉकेट के लिए है। यदि आप यूनिक्स पर पोर्टेबल एसिंक फ़ाइल आईओ चाहते हैं, तो आपको पॉज़िक्स एआईओ का उपयोग करना होगा या थ्रेडपूल पर अपने सिंक्रोनस आईओ को ऑफ़लोड करना होगा। –

0

अजगर 3 ऐसी कार्यक्षमता है लगता है। PEP 3116 देखें।

+1

ऐसा लगता है कि पीईपी 3116 एक नए I/O अमूर्तता से संबंधित है जिसमें गैर-अवरुद्ध I/O शामिल है। हालांकि, गैर-अवरुद्ध I/O एसिंक्रोनस I/O जैसा नहीं है। गैर-अवरुद्ध I/O आमतौर पर स्थानीय फाइल सिस्टम लिखने पर लागू नहीं होता है। –

2

मैं अजगर को aio.h bidings विकासशील हूँ: pyaio

यह linux केवल पर चलता है ..

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