【问题标题】:Why isn't the file lock released on close() if I launch a process while the file is locked?如果我在文件被锁定时启动进程,为什么在 close() 上没有释放文件锁定?
【发布时间】:2015-03-06 01:44:42
【问题描述】:

如果我打开文件,获取锁,然后关闭文件:

import fcntl
file = open("some_file", "w")
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
file.close()

文件关闭时文件锁立即释放,这是我所期望的。

但是,如果我在文件被锁定时启动后台进程:

import fcntl
import subprocess
file = open("some_file", "w")
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
subprocess.Popen(["python", "-c", "import time; time.sleep(10.0)"])
file.close()

上面的代码立即退出,但是文件锁直到后台进程完成才释放。如果我运行上面的代码然后立即再次运行它,第二个实例会阻塞十秒钟。为什么锁没有释放?

我知道我可以通过使用LOCK_UN 调用flock() 来显式释放锁,但这不是我要问的。我的问题是,为什么启动后台进程会阻止 close() 释放文件锁?

【问题讨论】:

  • 因为锁由两个进程持有——父进程和继承它的子进程——并且文件锁定使用类似“引用计数”的语义。

标签: python locking subprocess


【解决方案1】:

子进程从父进程继承文件描述符。并且“锁定”可能会在不同操作系统进程之间共享同一文件(这就是锁定点)。

您也可以指定close_fds=True 来关闭子文件中的文件。 close_fds=True 是 Python 3 中 POSIX 系统的默认值。

从 Python 3.4 开始,新创建的文件描述符默认是不可继承的。见PEP 446

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多