使用Python open().write()将文件写入磁盘是否确保数据可用于其他进程?

2024-09-27 07:24:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

另一种方法是用四条线将数据强制送到磁盘。这将导致严重的性能损失:

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

f.write(status)

os.fsync(f)

f.close()

我不是想保护自己不受操作系统崩溃的影响。那么,这种方法是否将数据强制到操作系统缓冲区,以便其他进程在从磁盘打开文件时读取最新的状态数据?或者,我需要使用os.fsync()吗?


Tags: 文件数据方法进程os状态status情况
2条回答

自从Python2.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()

不,第一种方法不能保证数据被写出,因为一旦句柄不再被其write成员引用,就不能保证文件将被刷新和关闭。CPython可能就是这样,但不一定是其他Python解释器;它是Python垃圾收集器的实现细节。

您应该真正使用第二种方法,除了不需要os.fsync;只需关闭文件,数据就应该可用于其他进程。

或者,更好(Python >=2.5):

with open(self.statusfile, 'w') as f:
    f.write(status)

with版本是异常安全的:即使write失败,也会关闭文件。

相关问题 更多 >

    热门问题