在 Python 中,如果想要给一个文档加锁,可以使用 fcntl 模块。其中有 flock 和 lockf 两种不同的方式。首先我们先了解一下在 Linux 中的文档锁。
Linux 中的文档锁
在 Linux 中,flock 和 fcntl 都是系统调用,而 lockf 则是库函数。lockf 则是 fcntl 的封装,因此 lockf 和 fcntl 在底层实现是一样的,对文档加锁的效果也是一样的。
首先说一些概念:
文档锁:针对整个文档的锁,如 flock。
记录锁:针对整个文档和文档部分字节的锁,如 fcntl、lockf。
排他锁:也可以称为写锁、独占锁,同一时间只有一个进程可以加锁。
共享锁:也可以称为读锁,支持多个进程并发读文档内容,但不可以写。
睡眠锁:一般和等待队列同时存在,当无法获取锁的时候会在等待队列中睡眠,直到满足条件被唤醒,如 semaphore、mutex。
自旋锁:自旋锁在被持有时,其它进程再申请时将不断”自旋”,不会陷入睡眠,直到持有者释放。为保证性能,自旋锁不应被持有时间过长。
劝告锁(建议锁):不要求进程一定要遵守,是一种约定俗成的规则,某进程持有建议锁的时候,其它进程依然可以强制操作,如 flock、fcntl。
强制锁:是内核行为,在系统调用违反约束条件时,内核将直接阻拦,如 fcntl(fcntl也可实