Python使用fcntl模块实现文件加锁与解锁详解

听雨眠
听雨眠
发布时间:2026-10-13 | 2人浏览过
原创

本文详细介绍Python中fcntl模块的文件加锁机制,涵盖LOCK_SH共享锁、LOCK_EX排他锁及LOCK_NB非阻塞锁的使用。通过示例演示如何防止多进程并发写入冲突,并解析加锁与解锁的具体代码实现,帮助开发者掌握并发控制技巧。

本文通过具体示例,讲解如何利用Python的fcntl模块实现程序的文件加锁功能,供读者参考学习。

在Python中,可以通过引入fcntl模块来对文件进行加锁操作。

import fcntl

首先需要打开目标文件。

##当前目录下test文件要先存在,如果不存在会报错。或者以写的方式打开
f = open('./test')

接着对已打开的文件句柄执行加锁操作。

fcntl.flock(f,fcntl.LOCK_EX)

此时文件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_EX进行按位或(|)运算组合。 fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)

具体示例如下:

import sys
import time
import fcntl
class FLOCK(object):
 def __init__(self, name):
  self.fobj = open(name, 'w')
  self.fd = self.fobj.fileno()
 def lock(self):
  try:
   fcntl.lockf(self.fd, fcntl.LOCK_EX | fcntl.LOCK_NB) # 给文件加锁,使用了fcntl.LOCK_NB
   print '给文件加锁,稍等 ... ...'
   time.sleep(20)
   return True
  except:
   print '文件加锁,无法执行,请稍后运行。'
   return False
def unlock(self):
 self.fobj.close()
 print '已解锁'
if __name__ == "__main__":
 print sys.argv[1]
 locker = FLOCK(sys.argv[1])
 a = locker.lock()
 if a:
  print '文件已加锁'
 else:
  print '无法执行,程序已锁定,请稍等'

首先运行一个终端,输出结果如下:

python lockfile.py test test 给文件加锁,稍等 ... ... 文件已加锁

随后在另一个终端运行相同脚本:

test 文件加锁,无法执行,请稍后运行。 无法执行,程序已锁定,请稍等

如需了解更多Python相关知识,可参考本站专题:《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》。

希望本文所述内容能对您的Python程序设计有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表