我有一个与配置文件交互的库。当导入该库时,初始化代码会读取配置文件,可能会更新它,然后将更新后的内容写回到文件中(即使没有更改)。
很少情况下,我会遇到配置文件内容突然消失的问题。具体来说,当我连续多次运行一个短脚本(使用该库),数千次之后,就会发生这种情况。它从不发生在同一目录中,这让我相信这是一个有点随机的问题--特别是IO的竞争条件。
由于无法可靠地重现这个问题,而且只在某些系统上出现,所以这很难调试。我对可能发生的事情有怀疑,但我想看看我关于Python文件IO的理解是否正确。
因此问题是: Python程序实际上什么时候将文件内容写入磁盘?我认为,文件关闭时文件内容应该已经写入磁盘,但是我无法解释这个错误。当Python关闭文件时,它是否会将内容刷新到磁盘本身,还是仅将其排队到文件系统?文件内容是否可能在Python终止后写入磁盘?我可以通过使用
如果有关系,我正在Unix系统(特别是Mac OS X)上编程。编辑:还要注意,这些进程不会同时运行。
附录:这里是我怀疑的具体竞争条件:
很少情况下,我会遇到配置文件内容突然消失的问题。具体来说,当我连续多次运行一个短脚本(使用该库),数千次之后,就会发生这种情况。它从不发生在同一目录中,这让我相信这是一个有点随机的问题--特别是IO的竞争条件。
由于无法可靠地重现这个问题,而且只在某些系统上出现,所以这很难调试。我对可能发生的事情有怀疑,但我想看看我关于Python文件IO的理解是否正确。
因此问题是: 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将其版本的配置文件写入磁盘,覆盖上一个版本。
'w'
打开,内容就会被截断。如果另一个进程在它被再次写入之前从中读取,它将为空。 - cmd