gpt4 book ai didi

python - Python 何时将文件写入磁盘?

转载 作者:太空狗 更新时间:2023-10-30 01:34:37 27 4
gpt4 key购买 nike

我有一个与配置文件交互的库。导入库时,初始化代码读取配置文件,可能会更新它,然后将更新的内容写回文件(即使没有任何更改)。

我偶尔会遇到配置文件的内容完全消失的问题。具体来说,当我背对背运行一个短脚本的多次调用(使用库)数千次时,就会发生这种情况。它永远不会出现在相同的目录中,这让我相信这是一个有点随机的问题——特别是与 IO 的竞争条件。

调试起来很麻烦,因为我永远无法可靠地重现该问题,而且它只发生在某些系统上。我怀疑可能会发生什么,但我想看看我对 Python 文件 I/O 的描述是否正确。

所以问题是,Python 程序什么时候真正将文件内容写入磁盘?我认为内容会在文件关闭时写入磁盘,但后来我可以' 解释这个错误。当 python 关闭文件时,它会将内容刷新到磁盘本身,还是只是将其排队到文件系统? 是否可以在 Python 终止后将文件内容写入磁盘? 我可以通过使用 fp.flush(); 来避免这个问题吗? os.fsync(fp.fileno())(其中 fp 是文件句柄)?

如果重要的话,我正在 Unix 系统(特别是 Mac OS X)上编程。 编辑:另外,请记住进程不是同时运行的。

附录:这是我怀疑的特定竞争条件:

  1. 进程 #1 被调用。
  2. 进程 #1 以读取模式打开配置文件并在完成后将其关闭。
  3. 进程 #1 以写入模式打开配置文件,删除其所有内容。内容的删除同步到磁盘。
  4. 进程 #1 将新内容写入文件句柄并将其关闭。
  5. 过程 #1:关闭文件后,Python 告诉操作系统排队将这些内容写入磁盘。
  6. 进程 #1 关闭并退出
  7. 进程 #2 被调用
  8. 进程 #2 以读取模式打开配置文件,但新内容尚未同步。进程 #2 看到一个空文件。
  9. 在进程 2 读取文件后,操作系统最终完成将内容写入磁盘
  10. 进程 #2 认为文件为空,为配置文件设置默认值。
  11. 进程 #2 将其版本的配置文件写入磁盘,覆盖最后一个版本。

最佳答案

这几乎可以肯定不是 python 的错。如果 python 关闭文件,或者干净地退出(而不是被信号杀死),那么操作系统将拥有文件的新内容。任何后续打开都应返回新内容。一定有更复杂的事情发生。这里有一些想法。

  1. 您所描述的听起来更像是文件系统错误而不是 Python 错误,而且文件系统错误的可能性很小。

  2. 如果您的文件实际驻留在远程文件系统中,则文件系统错误的可能性要大得多。是吗?

  3. 是否所有进程都使用同一个文件?对文件执行“ls -li”以查看其 inode 编号,并查看它是否发生过更改。在您的情况下,它不应该。是否有可能是某些东西在移动文件、移动目录或删除目录并重新创建它们?是否涉及符号链接(symbolic link)?

  4. 你确定你的程序运行没有重叠吗?它们中的任何一个都是从末尾带有“&”的 shell 运行的吗(即在后台)?这很容易意味着在第一个完成之前开始第二个。

  5. 是否有任何其他程序写入同一个文件?

  6. 这不是你的问题,但如果你需要原子更改(以便任何并行运行的程序只能看到旧版本或新版本,而不会看到空文件),实现它的方法是将新内容写入另一个文件(例如“foo.tmp”),然后执行 os.rename(“foo.tmp”, “foo”)。重命名是原子的。

关于python - Python 何时将文件写入磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16823109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com