美文网首页
2020-08-31 Python中给文件加锁解锁

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

作者: 昨天今天下雨天1 | 来源:发表于2020-08-31 10:42 被阅读0次

    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

    相关文章

      网友评论

          本文标题:2020-08-31 Python中给文件加锁解锁

          本文链接:https://www.haomeiwen.com/subject/ixkusktx.html