使用Python open()。write()将文件写入磁盘确保数据可供其他进程使用吗?

时间:2011-10-31 15:19:17

标签: python file-io operating-system

一个Python进程将状态更新写入文件以供其他进程读取。在某些情况下,状态更新会在循环中重复且快速地发生。最简单快捷的方法是使用open()。write()在一行中:

open(statusfile,'w').write(status) 

另一种方法,有四行强制数据到磁盘。这显着降低了性能:

f = open(self.statusfile,'w')

f.write(status)

os.fsync(f)

f.close()

我并不是想避免操作系统崩溃。那么,该方法是否会将数据强制到OS缓冲区,以便其他进程在从磁盘打开文件时读取最新的状态数据?或者,我是否需要使用os.fsync()?

2 个答案:

答案 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()