2012-02-13 4 views
13

मैं पायथन में एक गैर-अवरुद्ध विधि का उपयोग कर फ़ाइल में लिखना चाहता हूं। कुछ googling पर, मैंने पाया कि ऐसा करने के लिए भाषा fcntl का समर्थन करती है, लेकिन इसे लागू करने की विधि मुझे बहुत स्पष्ट नहीं है।गैर अवरुद्ध आईओ का उपयोग कर फ़ाइल में कैसे लिखना है?

यह कोड स्निपेट (मैं नहीं जानता कि मैं कहाँ गलत हो रहा हूँ) है:

import os, fcntl 
nf = fcntl.fcntl(0,fcntl.F_UNCLK) 
fcntl.fcntl(0,fcntl.F_SETFL , nf | os.O_NONBLOCK) 
nf = open ("test.txt", 'a') 
nf.write (" sample text \n") 

इस एक फ़ाइल पर एक गैर अवरुद्ध आईओ कार्रवाई करने के लिए सही तरीका है? मुझे शक है। इसके अलावा, क्या आप पाइथन में किसी अन्य मॉड्यूल का सुझाव दे सकते हैं जो मुझे ऐसा करने की अनुमति देता है?

+0

के संभावित डुप्लिकेट (http://stackoverflow.com/questions/319132/asynchronous-file-writing-possible-in-python) – jcollado

+0

[अतुल्यकालिक अजगर में संभव लेखन फ़ाइल?] नहीं, यह नहीं है कि मुझे केवल fcntl का उपयोग करके इसे सरल रखना होगा :) – Rahul

उत्तर

14

यह आप कैसे बारी है गैर अवरुद्ध यूनिक्स में एक फ़ाइल के लिए पर मोड:

fd = os.open("filename", os.O_CREAT | os.O_WRONLY | os.O_NONBLOCK) 
os.write(fd, "data") 
os.close(fd) 

यूनिक्स, हालांकि, turning on non-blocking mode has no visible effect for regular files! भले ही फ़ाइल गैर-अवरुद्ध मोड में है, os.write कॉल तुरंत वापस नहीं आएगी, यह तब तक सो जाएगा जब तक कि लेखन पूरा नहीं हो जाता है। अपने आप से यह प्रयोगात्मक साबित करने के लिए, इस प्रयास करें:

import os 
import datetime 

data = "\n".join("testing\n" * 10 for x in xrange(10000000)) 
print("Size of data is %d bytes" % len(data)) 

print("open at %s" % str(datetime.datetime.now())) 
fd = os.open("filename", os.O_CREAT | os.O_WRONLY | os.O_NONBLOCK) 
print("write at %s" % str(datetime.datetime.now())) 
os.write(fd, data) 
print("close at %s" % str(datetime.datetime.now())) 
os.close(fd) 
print("end at %s" % str(datetime.datetime.now())) 

आप देखेंगे कि os.write कॉल कई सेकंड लेता है। भले ही कॉल नॉन-अवरुद्ध है (तकनीकी रूप से, यह अवरुद्ध नहीं है, यह सो रहा है), कॉल असीमित नहीं है।


AFAIK, लिनक्स या विंडोज पर फ़ाइल को असीमित रूप से लिखने का कोई तरीका नहीं है। हालांकि, आप धागे का उपयोग कर इसे अनुकरण कर सकते हैं। ट्विस्ट के पास इस उद्देश्य के लिए deferToThread नामक एक विधि है। यहाँ कैसे आप इसका इस्तेमाल है:

from twisted.internet import threads, reactor 

data = "\n".join("testing\n" * 10 for x in xrange(10000000)) 
print("Size of data is %d bytes" % len(data)) 

def blocking_write(): 
    print("Starting blocking_write") 
    f = open("testing", "w") 
    f.write(data) 
    f.close() 
    print("End of blocking_write") 

def test_callback(): 
    print("Running test_callback, just for kicks") 

d = threads.deferToThread(blocking_code) 
reactor.callWhenRunning(cc) 
reactor.run() 
+0

मैं लाइनरिएवर या सर्वर फैक्ट्री द्वारा बनाए गए ऐसे अन्य प्रोटोकॉल के भीतर रिएक्टर ऑब्जेक्ट तक पहुंच कैसे प्राप्त करूं? – Sean

+0

एक गैर-अवरुद्ध लेखन POSIX AIO या Windows IOCP के साथ नियमित फ़ाइल में किया जा सकता है। – strcat

4

लेखन ओएस द्वारा कैश किए जाते हैं और कुछ सेकंड के बाद डिस्क पर डंप किए जाते हैं। यही है, वे पहले से ही "अवरुद्ध नहीं कर रहे हैं"। आपको कुछ खास करने की ज़रूरत नहीं है।

+0

क्या होगा यदि फ़ाइल वास्तव में नेटवर्क शेयर पर माउंट की जाती है? निश्चित रूप से, कॉल प्राप्त होने के बाद ही कॉल वापस आ जाएगा? – Flimm

+1

दूरस्थ फ़ाइल सिस्टम और अर्थपूर्ण कार्यान्वित, तुल्यकालिक या असीमित के निर्भर करता है। दोनों के उदाहरण हैं, या यहां तक ​​कि "बंद पर सिंक" जैसी चीजें भी हैं। – jcea

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