以下是如何在UNIX中为文件打开非阻塞模式的方法:
fd = os.open("filename", os.O_CREAT | os.O_WRONLY | os.O_NONBLOCK)
os.write(fd, "data")
os.close(fd)
在UNIX系统中,
开启非阻塞模式对于普通文件没有可见效果!即使文件处于非阻塞模式,
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
调用需要几秒钟的时间。尽管调用是非阻塞的(技术上来说,它不是阻塞的,而是在休眠),但该调用
不是异步的。
据我所知,在Linux或Windows上没有异步写入文件的方法。但是,您可以使用线程模拟它。Twisted有一个名为
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()