【发布时间】: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