gpt4 book ai didi

python - 如果我在文件锁定时启动进程,为什么在 close() 上文件锁没有释放?

转载 作者:行者123 更新时间:2023-12-01 04:54:02 25 4
gpt4 key购买 nike

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

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 调用集群()来显式释放锁,但这不是我要问的。我的问题是,为什么启动后台进程会阻止 close() 释放文件锁?

最佳答案

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

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

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

关于python - 如果我在文件锁定时启动进程,为什么在 close() 上文件锁没有释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27831740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com