我是靠谱客的博主 爱笑发夹,最近开发中收集的这篇文章主要介绍Python fcntl文件锁实践fcntl文件锁实践,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

fcntl文件锁实践

官方文档 https://docs.python.org/3.8/library/fcntl.html

基本使用

import fcntl
file_path = 'file2lock.txt'
def test_lock(mode, lock):
f = open(file_path, mode)
fcntl.flock(f, lock) # 对文件加锁
# fcntl.flock(f.fileno(), lock)
# 第一个参数传f.fileno()也一样
# file operation
fcntl.flock(f, fcntl.LOCK_UN)
# 解锁
f.close()
if __name__ == '__main__':
test_lock('a', fcntl.LOCK_EX)

LOCK_EX 互斥锁
LOCK_SH 共享锁
LOCK_UN 解锁
LOCK_NB 非阻塞锁,须与LOCK_EX或LOCK_SH按位与使用
即共有以下几种:
LOCK_EX,LOCK_SH,LOCK_UN,LOCK_EX|LOCK_NB,LOCK_SH|LOCK_NB

劝告锁

fcntl只是劝告锁,并非对文件真正上锁,因此使用时须在代码中显式获取fcntl锁
验证:

# test_lock.py
import fcntl
file_path = 'file2lock.txt'
def test_lock(mode, lock):
f = open(file_path, mode)
print('try lock')
fcntl.flock(f, lock)
i = input('Enter: ')
fcntl.flock(f, fcntl.LOCK_UN)
print('file unlocked')
f.close()
if __name__ == '__main__':
test_lock('a', fcntl.LOCK_SH)
# file_operation.py
file_path = 'file2lock.txt'
with open(file_path, 'a') as f:
f.write(f"nwrite without lock")

先运行test_lock.py进程上锁后卡在等待输入,再运行file_operation.py可直接写文件;另起一个进程运行test_lock.py,进程卡在获取锁。

进程退出自动解锁

验证:
还是两个进程都运行test_lock.py,一个进程等待输入一个进程卡在获取锁,杀掉等待输入进程,另外一个进程自动获取到锁。

自锁自解

fcntl上锁后,只能由上锁线程解锁。

进程验证

# test_lock_1.py
def test_lock(mode, lock):
f = open(file_path, mode)
fcntl.flock(f, fcntl.LOCK_UN) # 先尝试解锁
print('try lock')
fcntl.flock(f, lock)
i = input('Enter: ')
fcntl.flock(f, fcntl.LOCK_UN)
print('file unlocked')
f.close()

先执行test_lock.py再运行test_lock_1.py,后者仍然卡在获取锁,因此解锁必须同进程。

线程验证

# test_lock_2.py
def thread_unlock():
time.sleep(5)
f = open(file_path, 'a')
fcntl.flock(f, fcntl.LOCK_UN)
print('subthread unlocked')
def test_lock(mode, lock):
print(os.getpid())
f = open(file_path, mode)
print('try lock')
fcntl.flock(f, lock)
p = threading.Thread(target=thread_unlock)
p.start()
i = input('Enter: ')
fcntl.flock(f, fcntl.LOCK_UN)
print('file unlocked')
f.close()

先运行test_lock_2.py再运行test_lock.py,前者子线程解锁后后者仍然卡在获取锁,因子解锁必须同线程。

最后

以上就是爱笑发夹为你收集整理的Python fcntl文件锁实践fcntl文件锁实践的全部内容,希望文章能够帮你解决Python fcntl文件锁实践fcntl文件锁实践所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部