使用Python的open().write()将文件写入磁盘是否保证其他进程能获取到数据?

8 投票
2 回答
17574 浏览
提问于 2025-04-17 05:21

有一个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 失败,文件也会被关闭。

撰写回答