我有一个关于flock()
如何工作的问题,特别是在python中。我有一个打开串行连接的模块(通过os.open()
)。我需要使这个线程安全。使用threading.Lock()
在同一模块中工作时,使其线程安全很容易,但如果模块从不同的位置导入,则会中断。
我正在考虑使用flock()
,但我无法找到有关flock如何工作的足够信息。我读到flock()在文件关闭后解锁文件。但是,如果python崩溃,是否存在使文件保持打开的情况?
如果设置了LOCK_EX
,那么允许使用锁定文件的确切原因是什么?只是锁定文件的模块?从最初运行的脚本导入的任何模块?
答案 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。