一致的阅读和写作在Python的文件(Consistent reading and writing

2019-10-18 18:49发布

我是一个Python初学者和面临如下:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。 我通过设置文件与用户输入的值写入一些UI触发另一个脚本。 我用的是configparser模块用来对读取和写入文件。

我想知道如果这种情况能够领先进入不一致的状态(在读取设置文件中一样,其他的剧本开始写)。 我不知道是否有幕后任何机制来自动防止这种情况。

如果这种不一致是可能的,什么可能我使用同步脚本和十个分量操作的完整性?

Answer 1:

我是一个Python初学者和面临如下:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。 我通过设置文件与用户输入的值写入一些UI触发另一个脚本。

当读者阅读而作家写入文件,让读者可以读取该文件,而它是不完整有可能是一个竞争条件。

您可以通过锁定文件在读取和写入(见从这场比赛中保护Linux的羊群()或Python的锁文件模块 ),使读者从未观察到该文件不完整。

或者,更好的,你可以先写到一个临时文件,完成后重新命名其原子的最终名称。 这样,读者和作家从来没有阻止:

def write_config(config, filename):
    tmp_filename = filename + "~"
    with open(tmp_filename, 'wb') as file:
        config.write(file)
    os.rename(tmp_filename, filename)

当作者使用上述方法不需要改变到读取器。



Answer 2:

当你写的配置文件,它第一次写入到一个临时文件。 当它完成后,将其重命名为正确的名称。 重命名操作( os.rename )通常被实现为在Unix系统上,Linux和Windows,我也觉得一个原子操作,所以不会有其他进程试图读取配置的风险,同时写入没有结束然而。



Answer 3:

有解决这个问题(假设你是一个UNIX十岁上下的系统上),人至少有两种方法:

  • 如果你想要写,写一个临时文件 ,然后再做些什么unix可以用原子做的 ,尤其是rename临时文件到位。

  • 锁定任何操作过程中的文件,例如本的帮助文件锁模块。

就个人而言,我喜欢的第一个选项,因为它使用的操作系统,尽管有些系统曾与原子问题: 关于如何重命名在Mac OS X被打破 -另一个限制:重命名系统调用无法在设备重命名文件。



文章来源: Consistent reading and writing a file in python