Skip to content

python sync file lock

KerwinKoo edited this page Dec 28, 2015 · 1 revision

python 文件锁

python中文件操作往往会涉及到多个进程向同一个文件write的情况,这时要想保证同时只有一个进程写文件,可以采用如下方法:

使用fcntl.flock.

锁类型(fcntl.flock函数的第二个参数)

LOCK_SH:表示要创建一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有
LOCK_EX:表示创建一个排他锁,在任意时间内,一个文件的排他锁只能被一个进程拥有
LOCK_UN:表示删除该进程创建的锁
LOCK_MAND:它主要是用于共享模式强制锁,它可以与 LOCK_READ 或者 LOCK_WRITE 联合起来使用,从而表示是否允许并发的读操作或者并发的写操作(尽管在 flock() 的手册页中没有介绍 LOCK_MAND,但是阅读内核源代码就会发现,这在内核中已经实现了)
~~~

## 代码实例

```python
# coding:utf-8

"""
文件锁测试
"""

import fcntl
import time

fp = open('hello.txt','w')
fcntl.flock(fp, fcntl.LOCK_EX)
print '文件锁开始执行'
time.sleep(100)
fcntl.flock(fp, fcntl.LOCK_UN)
fp.close()
```

## 代码说明

通常情况下,如果加锁请求不能被立即满足,那么系统调用 flock()会阻塞当前进程。

比如,进程想要请求一个排他锁,但此时,已经由其他进程获取了这个锁,那么该进程将会被阻塞。如果想要在没有获得这个排他锁的情况下不阻塞该进程,可以将LOCK_NB 和 LOCK_SH 或者 LOCK_EX 联合使用,那么系统就不会阻塞该进程。flock()所加的锁会对整个文件起作用。

## 注意

1. 对于文件的 close() 操作会使文件锁失效;
2. 同理,进程结束后文件锁失效;
3. flock() 的 LOCK_EX是“劝告锁”,系统内核不会强制检查锁的状态,需要在代码中进行文件操作的地方显式检查才能生效。

[[TOC]]

Clone this wiki locally