2020-08-31 Python中给文件加锁解锁

2020-08-31  本文已影响0人  昨天今天下雨天1

fcntl模块:
flock() : flock(f, operation)
operation : 包括:
fcntl.LOCK_UN 解锁
fcntl.LOCK_EX 排他锁
fcntl.LOCK_SH 共享锁
fcntl.LOCK_NB 非阻塞锁
LOCK_SH 共享锁:所有进程没有写访问权限,即使是加锁进程也没有。所有进程有读访问权限。
LOCK_EX 排他锁:除加锁进程外其他进程没有对已加锁文件读写访问权限。
LOCK_NB 非阻塞锁:
如果指定此参数,函数不能获得文件锁就立即返回,否则,函数会等待获得文件锁。
LOCK_NB可以同LOCK_SH或LOCK_NB进行按位或(|)运算操作。 fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)

实例:
# !/usr/bin/python
# -*- encoding=utf8 -*-

import sys
import time
import fcntl


class FLOCK(object):

    def __init__(self, name, wait):
        self.name = name
        self.wait = wait

    def lock_unlock(self):
        try:
            with open(self.name, 'r+') as f:
                # fcntl.lockf(f, fcntl.LOCK_EX)  # 给文件加锁,阻塞进程
                fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)  # 给文件加锁,使用了fcntl.LOCK_NB,不阻塞进程
                print '对文件 {} 加锁,文件锁持续 {} 秒'.format(self.name, self.wait)
                time.sleep(int(self.wait))
                print '文件已解锁'
                # 1、文件close之后,文件锁也会失效
                # 2、进程结束后,文件锁也会失效
                # 3、flock()的LOCK_EX是"劝告锁",系统内核不会强制检查锁的状态,需要在代码中进行文件操作的地方显示检查才能生效
        except IOError as e:
            print '文件已加锁,无法执行加锁, err:%s' % e


if __name__ == "__main__":
    locker = FLOCK(sys.argv[1], sys.argv[2])
    locker.lock_unlock()

先运行一个终端会打印:


image.png

运行另外一个终端:


image.png
上一篇下一篇

猜你喜欢

热点阅读