一个Python进程将状态更新写入文件以供其他进程读取。在某些情况下,状态更新会在循环中重复且快速地发生。最简单快捷的方法是使用open()。write()在一行中:
open(statusfile,'w').write(status)
另一种方法,有四行强制数据到磁盘。这显着降低了性能:
f = open(self.statusfile,'w')
f.write(status)
os.fsync(f)
f.close()
我并不是想避免操作系统崩溃。那么,该方法是否会将数据强制到OS缓冲区,以便其他进程在从磁盘打开文件时读取最新的状态数据?或者,我是否需要使用os.fsync()?
答案 0 :(得分:12)
不,第一种方法不保证数据被写出,因为一旦句柄不再被write
成员引用,就无法保证文件将被刷新和关闭。这可能是CPython的情况,但不一定与其他Python解释器一样;它是Python垃圾收集器的实现细节。
除非不需要os.fsync
,否则你应该使用第二种方法;只需关闭文件,数据应该可供其他进程使用。
或者,甚至更好(Python >=2.5):
with open(self.statusfile, 'w') as f:
f.write(status)
with
版本是异常安全的:即使write
失败,文件也会关闭。
答案 1 :(得分:0)
从Python 2.2开始,可以将语言的内置类型子类化。这意味着您可以派生自己的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()