用python一致地读写文件
我是Python初学者,面临以下问题:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。我有另一个脚本,它由某个UI触发,该UI使用用户输入值编写设置文件。我使用ConfigParser模块读取和写入文件 我想知道这个场景是否会导致不一致的状态(比如在读取设置文件的过程中,另一个脚本开始编写)。我不知道幕后是否有任何机制可以自动防止这种情况用python一致地读写文件,python,synchronization,Python,Synchronization,我是Python初学者,面临以下问题:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。我有另一个脚本,它由某个UI触发,该UI使用用户输入值编写设置文件。我使用ConfigParser模块读取和写入文件 我想知道这个场景是否会导致不一致的状态(比如在读取设置文件的过程中,另一个脚本开始编写)。我不知道幕后是否有任何机制可以自动防止这种情况 如果这种不一致是可能的,我可以用什么来同步脚本和保持操作的完整性?当您写入配置文件时,首先将其写入临时文件。完成后,将其重命名为正确的名称。我认为,重
如果这种不一致是可能的,我可以用什么来同步脚本和保持操作的完整性?当您写入配置文件时,首先将其写入临时文件。完成后,将其重命名为正确的名称。我认为,重命名操作(
os.rename
)通常在Unix系统、Linux和Windows上也是作为一个原子操作实现的,因此在写入尚未完成时,不会有其他进程尝试读取配置的风险。当您写入配置文件时,请先将其写入临时文件。完成后,将其重命名为正确的名称。重命名操作(os.rename
)通常也是在Unix系统、Linux和Windows上作为一个原子操作来实现的,我认为,因此在编写尚未完成时,不会有其他进程尝试读取配置的风险
我是Python初学者,面临以下问题:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。我有另一个脚本,它由某个UI触发,该UI使用用户输入值编写设置文件
当读卡器读取而写卡器写入文件时,可能存在竞争条件,因此读卡器可能在文件不完整时读取文件
您可以通过在读写时锁定文件(请参阅或)来防止这种竞争,以便读取器永远不会观察到文件不完整
或者,更好的方法是,您可以先写入一个临时文件,然后以原子方式写入最终名称。这样,读写器就不会阻塞:
def write_config(config, filename):
tmp_filename = filename + "~"
with open(tmp_filename, 'wb') as file:
config.write(file)
os.rename(tmp_filename, filename)
当编写器使用上述方法时,不需要对读取器进行任何更改
我是Python初学者,面临以下问题:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。我有另一个脚本,它由某个UI触发,该UI使用用户输入值编写设置文件
当读卡器读取而写卡器写入文件时,可能存在竞争条件,因此读卡器可能在文件不完整时读取文件
您可以通过在读写时锁定文件(请参阅或)来防止这种竞争,以便读取器永远不会观察到文件不完整
或者,更好的方法是,您可以先写入一个临时文件,然后以原子方式写入最终名称。这样,读写器就不会阻塞:
def write_config(config, filename):
tmp_filename = filename + "~"
with open(tmp_filename, 'wb') as file:
config.write(file)
os.rename(tmp_filename, filename)
当编写器使用上述方法时,不需要对读取器进行任何更改。至少有两种方法可以解决此问题(假设您使用的是unix ish系统):
- 如果要写入,请先写入一个临时文件,然后执行一些操作,尤其是
临时文件重命名
- 在任何操作期间锁定文件,例如在本模块的帮助下
就个人而言,我喜欢第一个选项,因为它使用了操作系统,尽管有些系统在原子性方面存在问题:-另一个限制:重命名系统调用不能跨设备重命名文件。解决此问题的方法至少有两种(假设您在unix系统上):
- 如果要写入,请先写入一个临时文件,然后执行一些操作,尤其是
临时文件重命名
- 在任何操作期间锁定文件,例如在本模块的帮助下
就个人而言,我喜欢第一个选项,因为它使用了操作系统,尽管有些系统在原子性方面存在问题:-另一个限制:重命名系统调用不能跨设备重命名文件。您可以锁定文件。看看你能不能锁定这个文件。看到了一个非常有趣的想法,尽管还应该做一件事,在EWR重命名文件之后删除临时文件哦,重命名是否可能引发异常?@klausjohan这是可能的,但可能不太可能,因为您已经在该目录中创建了一个临时文件,这意味着您有足够的权限这样做,并且有足够的磁盘空间来创建文件。但是,可能会发生一个罕见的错误,比如文件系统刚刚卸载,或者已经有一个目录具有这样的名称。在任何情况下,它都不会覆盖文件的旧版本。请参阅错误列表。这是一个非常有趣的想法,尽管还应该做一件事,在EWR重命名文件之后删除临时文件。哦,重命名是否可能引发异常?@klausjohan这是可能的,但可能不太可能,因为您已经在该目录中创建了一个临时文件,这意味着您有足够的权限这样做,并且有足够的磁盘空间来创建文件。但是,可能会发生一个罕见的错误,比如文件系统刚刚卸载,或者已经有一个目录具有这样的名称。在任何情况下,它都不会覆盖文件的旧版本。请参阅错误列表。