我有一个关于flock()
如何工作的问题,特别是在Python中。我有一个打开串行连接的模块(通过 os.open() )。我需要确保这个线程的安全。使用 threading.Lock()
在同一个模块中工作时,很容易使其线程安全,但如果模块从不同的位置导入,则会中断。
我正在考虑使用flock()
,但是我很难找到足够的关于flock到底如何工作的信息。我读到,一旦文件关闭,flock()就会解锁文件。但是,如果 python 崩溃,是否存在使文件保持打开状态的情况?
如果设置了LOCK_EX
,那么究竟允许什么使用锁定的文件?只是锁定文件的模块?从最初运行的脚本导入的任何模块?
最佳答案
当进程终止时,操作系统应该清理所有打开的文件资源(我确信有一些警告)。这是因为关闭文件时会释放咨询锁,该操作是 python
进程退出时操作系统清理的一部分。
记住,flock(2)仅供引用:
Advisory locks allow cooperating processes to perform consistent operations on files, but [other, poorly behaved] processes may still access those files without using advisory locks.
flock(2)实现读写锁。您无法使用 LOCK_EX
对同一个文件进行两次集群,但任意数量的人都可以同时使用 LOCK_SH
对同一文件进行集群(只要没有其他人拥有 LOCK_EX
就可以了)。
The locking mechanism allows two types of locks: shared locks and exclusive locks. At any time multiple shared locks may be applied to a file, but at no time are multiple exclusive, or both shared and exclusive, locks allowed simultaneously on a file.
flock 在操作系统/进程级别工作,独立于 python 模块。一个模块可能请求 n 个锁,或者跨 m 个模块请求 n 个锁。但是,在给定时间只有一个进程可以对给定文件持有 LOCK_EX
锁。
“非 UNIX”系统或非本地文件系统上的 YMMV。
关于python - 与flock()函数有关的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3918385/