zoukankan      html  css  js  c++  java
  • python 中给文件加锁

    python 中给文件加锁——fcntl模块
    import fcntl

    打开一个文件
    ##当前目录下test文件要先存在,如果不存在会报错。或者以写的方式打开
    f = open('./test')
    对该文件加密:
    fcntl.flock(f,fcntl.LOCK_EX)
    这样就对文件test加锁了,如果有其他进程对test文件加锁,则不能成功,会被阻塞,但不会退出程序。
    解锁:fcntl.flock(f,fcntl.LOCK_UN)

    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)

    请看事例:
    复制代码
     1 import sys
     2 import time
     3 import fcntl
     4 
     5 class FLOCK(object):
     6 
     7     def __init__(self, name):
     8         self.fobj = open(name, 'w')
     9         self.fd = self.fobj.fileno()
    10 
    11     def lock(self):
    12         try:
    13             fcntl.lockf(self.fd, fcntl.LOCK_EX | fcntl.LOCK_NB)  # 给文件加锁,使用了fcntl.LOCK_NB
    14             print '给文件加锁,稍等 ... ...'
    15             time.sleep(20)
    16             return True
    17         except:
    18             print '文件加锁,无法执行,请稍后运行。'
    19             return False
    20 
    21 
    22 def unlock(self):
    23     self.fobj.close()
    24     print '已解锁'
    25 
    26 if __name__ == "__main__":
    27     print sys.argv[1]
    28     locker = FLOCK(sys.argv[1])
    29     a = locker.lock()
    30     if a:
    31         print '文件已加锁'
    32     else:
    33         print '无法执行,程序已锁定,请稍等'
    复制代码

    先运行一个终端会打印:

      python lockfile.py test

      test

      给文件加锁,稍等 ... ...

      文件已加锁

    运行另外一个终端:

      test

         文件加锁,无法执行,请稍后运行。

         无法执行,程序已锁定,请稍等

  • 相关阅读:
    HDU 5744
    HDU 5815
    POJ 1269
    HDU 5742
    HDU 4609
    fzu 1150 Farmer Bill's Problem
    fzu 1002 HangOver
    fzu 1001 Duplicate Pair
    fzu 1150 Farmer Bill's Problem
    fzu 1182 Argus 优先队列
  • 原文地址:https://www.cnblogs.com/jubing/p/11648266.html
Copyright © 2011-2022 走看看