1

我有一个关于如何flock()工作的问题,尤其是在 python 中。我有一个打开串行连接的模块(通过os.open())。我需要使这个线程安全。在同一个模块中使用时,使其线程安全很容易threading.Lock(),但是如果模块从不同的地方导入,它就会中断。

我正在考虑使用flock(),但我无法找到足够的关于羊群如何工作的信息。我读到flock() 会在文件关闭后解锁文件。但是,如果 python 崩溃,是否存在保持文件打开的情况?

LOCK_EX如果设置了锁定文件,究竟允许使用什么?只是锁定文件的模块?从最初运行的脚本中导入的任何模块?

4

1 回答 1

2

当一个进程死亡时,操作系统应该清理所有打开的文件资源(有一些警告,我敢肯定)。这是因为关闭文件时会释放咨询锁,这是在python进程退出时作为操作系统清理的一部分发生的操作。

请记住,flock(2)只是建议性的:

咨询锁允许合作进程对文件执行一致的操作,但[其他,行为不佳的]进程仍可能在不使用咨询锁的情况下访问这些文件。

flock(2)实现了一个读写锁。您不能将同一个文件用 集群两次LOCK_EX,但任何数量的人都可以LOCK_SH同时集群它(只要没有其他人LOCK_EX在它上面)。

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

羊群在操作系统/进程级别工作,独立于 python 模块。一个模块可以请求n 个锁,或者可以跨m个模块请求 n锁。但是,在给定时间,只有一个进程可以锁定给定文件。LOCK_EX

“非 UNIX”系统或非本地文件系统上的 YMMV。

于 2010-10-12T20:01:34.833 回答