我在想,pathlib 中的 Path.write_text(data)
函数是否具有原子性。
如果没有,是否存在这样的情况,即文件已经在文件系统中创建,但不包含预期内容?
更具体地说,正如 @ShadowRanger 的评论所建议的那样,我关心的是知道文件是否包含原始数据或新数据,但从未出现过中间状态。实际上,这比完全的原子性要少一些。
我在想,pathlib 中的 Path.write_text(data)
函数是否具有原子性。
如果没有,是否存在这样的情况,即文件已经在文件系统中创建,但不包含预期内容?
更具体地说,正如 @ShadowRanger 的评论所建议的那样,我关心的是知道文件是否包含原始数据或新数据,但从未出现过中间状态。实际上,这比完全的原子性要少一些。
不,它并不会通过在同一目录中打开临时文件、填充它,并以原子重命名来替换原始文件。当前实现至少保证有两个唯一操作:
如果什么都不做,您的代码可能在步骤1之后,步骤2之前死亡(错误时机的Ctrl-C或电源故障),原始数据将消失,没有新数据被写入。
这个问题在表面上看起来无意义。即使它是原子的,在写入发生一纳秒后,其他进程也可以打开该文件,截断它、重写它、移动它等等。甚至在write_text
打开文件并写入数据之间,其他进程也可以扫荡并移动/重命名新打开的文件或删除它;当它一秒后写入数据时,write_text
保持的打开句柄仍将起作用,但提供路径中的数据将永远不会出现在文件中(并且如果其他进程扫荡并删除它,则可能在write_text
关闭它的那一刻消失)。
此外,在任何可移植意义下,甚至在写入过程中,它也不能是原子性的。两个进程可以同时打开同一个文件,并且它们的写操作可以交错执行(在进程内部有关标准处理程序的锁来防止这种情况,但没有这样的锁来与任意其他进程协调)。并发文件I/O很难;尽可能避免。