我是一个Python初学者和面临如下:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。 我通过设置文件与用户输入的值写入一些UI触发另一个脚本。 我用的是configparser模块用来对读取和写入文件。
我想知道如果这种情况能够领先进入不一致的状态(在读取设置文件中一样,其他的剧本开始写)。 我不知道是否有幕后任何机制来自动防止这种情况。
如果这种不一致是可能的,什么可能我使用同步脚本和十个分量操作的完整性?
我是一个Python初学者和面临如下:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。 我通过设置文件与用户输入的值写入一些UI触发另一个脚本。 我用的是configparser模块用来对读取和写入文件。
我想知道如果这种情况能够领先进入不一致的状态(在读取设置文件中一样,其他的剧本开始写)。 我不知道是否有幕后任何机制来自动防止这种情况。
如果这种不一致是可能的,什么可能我使用同步脚本和十个分量操作的完整性?
我是一个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)
当作者使用上述方法不需要改变到读取器。
当你写的配置文件,它第一次写入到一个临时文件。 当它完成后,将其重命名为正确的名称。 重命名操作( os.rename
)通常被实现为在Unix系统上,Linux和Windows,我也觉得一个原子操作,所以不会有其他进程试图读取配置的风险,同时写入没有结束然而。
有解决这个问题(假设你是一个UNIX十岁上下的系统上),人至少有两种方法:
如果你想要写,写一个临时文件 ,然后再做些什么unix可以用原子做的 ,尤其是rename
临时文件到位。
锁定任何操作过程中的文件,例如本的帮助文件锁模块。
就个人而言,我喜欢的第一个选项,因为它使用的操作系统,尽管有些系统曾与原子问题: 关于如何重命名在Mac OS X被打破 -另一个限制:重命名系统调用无法在设备重命名文件。