flock() 函数出现问题

2 投票
1 回答
7907 浏览
提问于 2025-04-16 05:23

我有一个关于 flock() 如何工作的疑问,特别是在 Python 中。我有一个模块,它打开一个串口连接(通过 os.open())。我需要让这个模块在多线程环境中安全使用。当在同一个模块中使用 threading.Lock() 时,做到这一点很简单,但如果这个模块从不同的地方被导入,就会出现问题。

我在考虑使用 flock(),但我发现很难找到足够的信息来了解它到底是怎么工作的。我读到 flock() 会在文件关闭后解锁文件。但是,如果 Python 崩溃了,有没有可能让文件保持打开状态呢?

还有,当设置了 LOCK_EX 时,究竟哪些程序可以使用被锁定的文件?只有锁定文件的那个模块可以吗?还是说任何从最初运行的脚本中导入的模块都可以使用?

1 个回答

3

当一个进程结束时,操作系统应该清理任何打开的文件资源(当然,这里有一些例外)。这是因为当文件关闭时,建议锁会被释放,而这个关闭操作是在进程退出时作为操作系统清理的一部分进行的。

记住,flock(2)只是一个建议性锁:

建议锁允许合作的进程对文件进行一致的操作,但[其他一些不太守规矩的]进程仍然可以在不使用建议锁的情况下访问这些文件。

flock(2)实现了一种读写锁。你不能对同一个文件使用两次LOCK_EX锁,但任何数量的人可以同时使用LOCK_SH锁(只要没有其他人对它持有LOCK_EX锁)。

这个锁机制允许两种类型的锁:共享锁和独占锁。任何时候,多个共享锁可以应用于一个文件,但在任何时候,多个独占锁或共享锁和独占锁同时存在于一个文件上都是不允许的。

flock在操作系统/进程级别工作,与python模块无关。一个模块可以请求n个锁,或者m个模块可以请求n个锁。不过,在同一时间内,只有一个进程可以对某个文件持有LOCK_EX锁。

在“非UNIX”系统或非本地文件系统上,情况可能会有所不同。

撰写回答