我想知道pathlib中的Path.write_text(data)
函数是否是原子函数。
如果没有,是否存在这样的情况:我们最终会在文件系统中创建一个文件,但不包含预期内容?
更具体地说,正如@ShadowRanger的评论所暗示的那样,我关心的是知道文件是否包含原始数据或新数据,但永远不要介于两者之间。这实际上不如完全原子性。
在包含原始数据或新数据的文件的特定情况下,两者之间没有任何内容:
不,它不会在同一目录中打开一个临时文件,填充它,并以原子重命名来替换原始文件。目前的实施保证至少有两种独特的操作:
- 在写入模式下打开文件(这会隐式地截断它(,并且
- 写出所提供的数据(根据数据的大小、操作系统API的限制以及信号的干扰,可能会中断写入部分,并要求在单独的系统调用中写入剩余部分(
如果没有其他情况,您的代码可能会在步骤1之后和步骤2之前死亡(Ctrl-C时间不正确或断电(,原始数据将消失,也不会写入新数据。
关于一般原子性的旧答案:
这个问题从表面上看有点荒谬。如果它是原子的,那就不重要了;即使它是原子的,在写入发生一纳秒后,其他一些进程也可以打开文件、截断文件、重写文件、移动文件等。见鬼,在write_text
打开文件和写入数据之间,其他一些过程可以突然进入并移动/重命名新打开的文件或删除它;write_text
保持的打开句柄在一纳秒后写入时仍然可以工作,但在所提供的路径上的文件中永远看不到数据(并且可能在write_text
关闭它的那一刻消失,如果其他进程突然进入并删除了它(。
除此之外,在编写时,它甚至不能是原子的,在任何可移植的意义上。两个进程可以同时打开同一个文件,并且它们的写入可以交错(在进程内的标准句柄周围有锁来防止这种情况,但不存在这样的锁来与任意其他进程协调(。并发文件I/O很难;尽可能避免。