यह आप कैसे बारी है गैर अवरुद्ध यूनिक्स में एक फ़ाइल के लिए पर मोड:
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()
के संभावित डुप्लिकेट (http://stackoverflow.com/questions/319132/asynchronous-file-writing-possible-in-python) – jcollado
[अतुल्यकालिक अजगर में संभव लेखन फ़ाइल?] नहीं, यह नहीं है कि मुझे केवल fcntl का उपयोग करके इसे सरल रखना होगा :) – Rahul