【发布时间】:2013-12-04 13:20:54
【问题描述】:
我正在使用 ConfigParser 模块从两个 Python 脚本读取/写入 .conf 文件。一个脚本只读取数据,而另一个也可能写入 .conf 文件。考虑到这种情况可能以损坏的数据结束?或者 ConfigParser 正在阻止这种情况?
干杯
【问题讨论】:
标签: python multiprocessing configparser
我正在使用 ConfigParser 模块从两个 Python 脚本读取/写入 .conf 文件。一个脚本只读取数据,而另一个也可能写入 .conf 文件。考虑到这种情况可能以损坏的数据结束?或者 ConfigParser 正在阻止这种情况?
干杯
【问题讨论】:
标签: python multiprocessing configparser
ConfigParser 本身不知道如何打开和写入物理文件,因此无法防止竞争。您将一个类似文件的对象传递给write(),并由您来确保您正在更改的文件以原子方式更新。在 Linux 等 POSIX 系统上,这通常通过写入临时文件并在写入完成后将其重命名为最终名称来完成。
原子重命名要求源文件和目标文件位于同一文件系统上,保证这一点的简单方法是确保文件位于同一目录中。
import ConfigParser
import os
import tempfile
FILENAME = '/some/path/test.config'
config = ConfigParser.SafeConfigParser()
config.read([FILENAME])
config.add_section('foo')
with tempfile.NamedTemporaryFile(dir=os.path.dirname(FILENAME),
delete=False) as tempfile:
config.write(tempfile)
os.rename(tempfile.name, FILENAME)
这假设除了一个或多个并发读取器之外,您只有一个配置文件的并发写入器。
在 Windows 上进行原子替换并不那么简单。参见例如Is an atomic file rename (with overwrite) possible on Windows?。与讨论相关的还有How to safely write to a file? – 根据文件系统实现(及其挂载选项),元数据更改(重命名)可能在数据持久保存到文件之前完成。
【讨论】: