使用Python的open().write()将文件写入磁盘是否保证其他进程能获取到数据?
有一个Python程序会把状态更新写入一个文件,供其他程序读取。在某些情况下,这些状态更新会在一个循环中快速重复发生。最简单、最快的方法就是用一行代码来打开文件并写入:
open(statusfile,'w').write(status)
还有一种替代的方法,虽然需要四行代码,但它会强制把数据写入磁盘。这种方法会显著影响性能:
f = open(self.statusfile,'w')
f.write(status)
os.fsync(f)
f.close()
我并不是想防止操作系统崩溃。那么,这种方法会把数据强制写入操作系统的缓存中,让其他程序在从磁盘打开文件时读取到最新的状态数据吗?还是说我需要使用os.fsync()?
2 个回答
0
从Python 2.2开始,你可以创建自己版本的Python内置类型。这意味着你可以定义一个自己的file
类型,让它的write()
方法返回self
,而不是像内置版本那样什么都不返回。这样做的好处是,你可以把close()
方法接在你的代码后面,形成一行代码完成多个操作。
class ChainableFile(file):
def __init__(self, *args, **kwargs):
return file.__init__(self, *args, **kwargs)
def write(self, str):
file.write(self, str)
return self
def OpenFile(filename, *args, **kwargs):
return ChainableFile(filename, *args, **kwargs)
statusfile = 'statusfile.txt'
status = 'OK\n'
OpenFile(statusfile,'w').write(status).close()
13
不,第一种方法并不能保证数据一定会被写入,因为一旦文件句柄不再被它的 write
成员引用,就不能保证文件会被刷新和关闭。这在 CPython 中可能是这样的,但在其他 Python 解释器中不一定如此;这属于 Python 垃圾回收器的实现细节。
你应该使用第二种方法,不过 os.fsync
其实是不需要的;只要关闭文件,数据就应该能被其他进程访问。
或者,更好的方法是使用 (Python >=2.5):
with open(self.statusfile, 'w') as f:
f.write(status)
with
这种写法是安全的:即使 write
失败,文件也会被关闭。