如果我在文件锁定时启动进程,为什么文件锁定没有在 close() 上释放?
Why isn't the file lock released on close() if I launch a process while the file is locked?
如果我打开文件,获取锁,然后关闭文件:
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() 释放文件锁?
子进程从父进程继承文件描述符。 "locking" 可能会在不同 OS 进程之间共享同一个文件(这就是锁定点)。
您也可以指定 close_fds=True
关闭子文件。 close_fds=True
是 Python 中 POSIX 系统的默认值 3.
自 Python 3.4 以来,默认情况下新创建的文件描述符是不可继承的。参见 PEP 446。
如果我打开文件,获取锁,然后关闭文件:
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() 释放文件锁?
子进程从父进程继承文件描述符。 "locking" 可能会在不同 OS 进程之间共享同一个文件(这就是锁定点)。
您也可以指定 close_fds=True
关闭子文件。 close_fds=True
是 Python 中 POSIX 系统的默认值 3.
自 Python 3.4 以来,默认情况下新创建的文件描述符是不可继承的。参见 PEP 446。