遇到flock()函数的问题

时间:2010-10-12 19:43:24

标签: python locking fcntl flock

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

  

通知锁允许合作进程对文件执行一致的操作,但[其他行为不当的]进程仍可以在不使用建议锁的情况下访问这些文件。

flock(2)实现了一个reader-writer锁。你不能用LOCK_EX两次聚集同一个文件,但是任何数量的人都可以同时用LOCK_SH来填充它(只要其他人没有LOCK_EX就可以了。)

  

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

flock在OS /进程级别工作,独立于python模块。一个模块可以请求 n 锁,或者可以跨 m 模块请求 n 锁。但是,在给定时间,只有一个进程可以对给定文件保持LOCK_EX锁定。

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