Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python一致地读写文件_Python_Synchronization - Fatal编程技术网

用python一致地读写文件

用python一致地读写文件,python,synchronization,Python,Synchronization,我是Python初学者,面临以下问题:我有一个脚本定期读取设置文件,并根据这些设置做一些事情。我有另一个脚本,它由某个UI触发,该UI使用用户输入值编写设置文件。我使用ConfigParser模块读取和写入文件 我想知道这个场景是否会导致不一致的状态(比如在读取设置文件的过程中,另一个脚本开始编写)。我不知道幕后是否有任何机制可以自动防止这种情况 如果这种不一致是可能的,我可以用什么来同步脚本和保持操作的完整性?当您写入配置文件时,首先将其写入临时文件。完成后,将其重命名为正确的名称。我认为,重

我是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这是可能的,但可能不太可能,因为您已经在该目录中创建了一个临时文件,这意味着您有足够的权限这样做,并且有足够的磁盘空间来创建文件。但是,可能会发生一个罕见的错误,比如文件系统刚刚卸载,或者已经有一个目录具有这样的名称。在任何情况下,它都不会覆盖文件的旧版本。请参阅错误列表。