• python的文件锁使用


    python的文件锁目前使用的是fcntl这个库,它实际上为 Unix上的ioctlflock和fcntl 函数提供了一个接口。

    1.fcntl库的简单使用

    import fcntl
    import os, time
    
    FILE = "counter.txt"
    
    if not os.path.exists(FILE):
        # create the counter file if it doesn't exist
        file = open(FILE, "w")
        file.write("0")
        file.close()
    
    for i in range(20):
        file = open(FILE, "r+")     #由于flock生成的是劝告锁,不能阻止进程对文件的操作,所以这里可以正常打开文件
        fcntl.flock(file.fileno(), fcntl.LOCK_EX)   #为了避免同时操作文件,需要程序自己来检查该文件是否已经被加锁。这里如果检查到加锁了,进程会被阻塞    
        print 'acquire lock'
        counter = int(file.readline()) + 1
        file.seek(0)
        file.write(str(counter))
        print os.getpid(), "=>", counter
        time.sleep(10)
        file.close() # unlocks the file
        print 'release lock'
        time.sleep(3)

    分别启动2个进程来同时运行这个脚本,我们可以很明显的看到2者互相之间交替阻塞。同一时刻只有一个进程能够对counter.txt文件进行操作。

    2.对fcntl.flock()函数的说明:

    linux的flock() 的函数原型如下所示:
    int flock(int fd, int operation);
    其中,参数 fd 表示文件描述符;参数 operation 指定要进行的锁操作,该参数的取值有如下几种:
    LOCK_SH:表示要创建一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有;
    LOCK_EX:表示创建一个排他锁,在任意时间内,一个文件的排他锁只能被一个进程拥有;
    LOCK_UN:表示删除该进程创建的锁;
    LOCK_MAND:它主要是用于共享模式强制锁,它可以与 LOCK_READ 或者 LOCK_WRITE联合起来使用,从而表示是否允许并发的读操作或者并发的写操作;
        
    通常情况下,如果加锁请求不能被立即满足,那么系统调用 flock()会阻塞当前进程。比如,进程想要请求一个排他锁,但此时,已经由其他进程获取了这个锁,那么该进程将会被阻塞。如果想要在没有获得这个排他锁的情况下不阻塞该进程,可以将LOCK_NB 和 LOCK_SH 或者 LOCK_EX 联合使用,那么系统就不会阻塞该进程。flock()所加的锁会对整个文件起作用。
    注意:
    1. 对于文件的 close() 操作会使文件锁失效;
    2. 同理,进程结束后文件锁失效;

    3. flock() 的 LOCK_EX是“劝告锁”,系统内核不会强制检查锁的状态,需要在代码中进行文件操作的地方显式检查才能生效。

    3.相关资料

    1.Linux中的文件锁的概念及其实现(http://blog.csdn.net/jianhong1990/article/details/26369465)

    2.fcntl模块的官方文档(https://docs.python.org/2/library/fcntl.html#fcntl.flock)

  • 相关阅读:
    上帝永远不会问你的十件事
    discuz x1.5 showmessage函数和showDialog函数解析
    人生,没有那么简单…
    Proxy代理对象是如何调用invoke()方法的.
    实现简单的AOP前置后置增强
    浅谈设计模式visitor访问者模式
    了解jsp,这一篇就够了.
    jsp之el表达式jstl标签
    orale数据库.实例.表空间.用户.表
    题解 UVa10892
  • 原文地址:https://www.cnblogs.com/chenjianhong/p/4144402.html
Copyright © 2020-2023  润新知