Đây là cách bạn bật chế độ non-blocking trên cho một tập tin trong UNIX:
fd = os.open("filename", os.O_CREAT | os.O_WRONLY | os.O_NONBLOCK)
os.write(fd, "data")
os.close(fd)
Trên UNIX, tuy nhiên, turning on non-blocking mode has no visible effect for regular files! Mặc dù tệp đang ở chế độ không chặn, cuộc gọi os.write
sẽ không trở lại ngay lập tức, nó sẽ ngủ cho đến khi quá trình ghi hoàn tất. Để chứng minh điều đó cho chính mình thực nghiệm, hãy thử này:
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()))
Bạn sẽ nhận thấy rằng cuộc gọi os.write
không mất vài giây. Mặc dù cuộc gọi không bị chặn (về mặt kỹ thuật, nó không chặn, nó đang ngủ), cuộc gọi là không phải không đồng bộ.
AFAIK, không có cách nào để ghi vào tệp không đồng bộ trên Linux hoặc trên Windows. Bạn có thể mô phỏng nó, tuy nhiên, bằng cách sử dụng chủ đề. Twisted có một phương thức có tên là deferToThread
cho mục đích này. Đây là cách bạn sử dụng nó:
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()
thể trùng lặp của (http://stackoverflow.com/questions/319132/asynchronous-file-writing-possible-in-python) – jcollado
[Asynchronous tập tin văn bản có thể trong python?] Không có nó, tôi cần phải giữ nó đơn giản bằng cách chỉ sử dụng fcntl :) – Rahul