我正在编写一个 python 脚本,它在 Linux 上使用 shutil.copyfile() 复制文件。在复制过程中,其他进程可能正在尝试读取文件。以下是否足以确保外部进程不会获得损坏的文件 View ?

os.unlink(dest)
shutil.copyfile(src, dest)

也就是说,shutil.copyfile() 是否具有原子性,以至于其他进程在复制操作完成之前无法读取目标文件?

最佳答案

不,shutil.copyfile 不是原子的。这是 definition of shutil.copyfile : 的一部分

def copyfile(src, dst, *, follow_symlinks=True):
    ...
    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)

其中 copyfileobj is defined like this :
def copyfileobj(fsrc, fdst, length=16*1024):
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)

调用 copyfile 的线程可以在这个 while-loop 中停止,此时其他一些进程可以尝试打开要读取的文件。它将获得损坏的文件 View 。

关于python - python的shutil.copyfile()是原子的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20873723/

10-16 13:49