我有一个与配置文件交互的库。当导入库时,初始化代码读取配置文件,可能会更新它,然后将更新的内容写回文件(即使没有更改)。Python何时将文件写入磁盘?
偶尔,我遇到配置文件内容简单消失的问题。具体来说,当我运行多个短文本(使用库)的调用时,会发生这种情况,背靠背数千次。它在同一个目录中从不发生,这导致我相信这是一个有点随机的问题 - 特别是与IO的竞争条件。
这是一个很难调试的问题,因为我无法可靠地重现问题,而且它只发生在某些系统上。我怀疑会发生什么,但我想看看我的Python中的文件I/O图片是否正确。
所以问题是,什么时候Python程序实际将文件内容写入磁盘?我认为在文件关闭的时候内容会让它进入磁盘,但是我无法解释这个错误。当python关闭一个文件时,它是否将内容刷新到磁盘本身,或者直接将它排入文件系统? Python终止后有可能将文件内容写入磁盘吗?我可以通过使用fp.flush(); os.fsync(fp.fileno())
(其中fp
是文件句柄)来避免此问题吗?
重要的是,我在Unix系统上编程(特别是Mac OS X)。 编辑:另外,请记住,这些进程没有同时运行。
附录:下面是具体的比赛情况,我怀疑:
- 过程#1被调用。
- 进程#1以读取模式打开配置文件并在完成时关闭它。
- 进程#1以写入模式打开配置文件,擦除其所有内容。内容的删除同步到磁盘。
- 进程#1将新内容写入文件句柄并关闭它。过程#1:在关闭文件时,Python告诉操作系统将这些内容写入磁盘。
- 处理#1闭合并退出
- 处理#2被调用
- 处理#2将在读出模式的配置文件,但是新的内容尚未同步。进程#2看到一个空文件。
- 操作系统最终完成将内容写入磁盘后,进程2读取文件
- 进程#2,认为文件为空,设置配置文件的默认值。
- 进程#2将其配置文件的版本写入磁盘,覆盖最后一个版本。
不,当Python关闭文件时,文件已被刷新到磁盘。我会说流程#2比您想象的更早打开文件。 –
如果多个进程并发访问一个文件,并且其中至少有一个进程正在写入,则必须同步这些进程以获得一致的结果。这不是特定于Python的东西。 –
即使操作系统没有将数据写入磁盘,只要它被刷出python,就会保证将文件的内容返回到第2个进程,因为访问该文件的任何人都共享了内存缓存。 (除非您在共享文件系统上的不同计算机上运行未配置为一致性的进程,或者存在覆盖文件的竞争条件)。 – nos