如果在文件锁定时启动进程,为什么不在close()上释放文件锁?

时间:2015-01-08 01:49:43

标签: python locking subprocess

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

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()释放文件锁?

1 个答案:

答案 0 :(得分:2)

子进程从父进程继承文件描述符。并且可以为不同OS进程之间的同一文件共享“锁定”(这是锁定点)。

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

自Python 3.4起,默认情况下,新创建的文件描述符是不可继承的。请参阅PEP 446