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

tah*_*oar 8 python file-io operating-system

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

open(statusfile,'w').write(status) 
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用四行强制数据到磁盘.这会显着降低性能:

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

f.write(status)

os.fsync(f)

f.close()
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*Foo 12

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

您应该使用第二种方法,除非os.fsync不需要; 只需关闭文件,数据应该可供其他进程使用.

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

with open(self.statusfile, 'w') as f:
    f.write(status)
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,关闭文件并不意味着`fsync()` - 它只意味着`fflush()`,但后者只需要能够在其他进程中看到对文件的更改. (3认同)