当前位置: 首页 > news >正文

LockFile简要分析

FileLock 是 Python 中用于实现文件级锁定的工具(来自 filelock 库),专门解决多进程/多线程环境下对共享资源(如文件)的并发访问问题。以下是它在当前代码中的 核心作用详细工作机制


1. 为什么需要 FileLock?

  • 问题场景:当多个进程同时运行 Expr2Vec_api 时,可能会同时读写同一个缓存文件 bgem3.json,导致:
  • 数据损坏:多个进程同时写入文件时,内容可能被覆盖或混合。
  • 脏读:一个进程正在写入时,另一个进程读取到不完整的中间状态。
  • 解决方案FileLock 通过创建一个临时锁文件(bgem3.json.lock)实现互斥访问,确保同一时间只有一个进程能操作文件。

2. FileLock 的工作流程

(1) 锁的创建
lock_file = cache_file + ".lock"# 锁文件路径(如 bgem3.json.lock)
with FileLock(lock_file):
# 临界区代码(读写文件)
  • 当进入 with 块时:
  1. 尝试创建 lock_file(若已存在则阻塞等待)。
  2. 锁文件存在期间,其他进程的 FileLock 会检测到锁并等待。
(2) 文件操作的安全性
  • 读缓存时
with FileLock(lock_file):
if os.path.exists(cache_file):
with open(cache_file, 'r') as f:
cache = json.load(f)
  • 其他进程无法修改文件,直到当前进程释放锁(退出 with 块)。

  • 写缓存时

with FileLock(lock_file):
with open(cache_file, 'w') as f:
json.dump(updated_cache, f)
  • 写入时独占文件,避免其他进程同时写入导致数据损坏。
(3) 锁的释放
  • 退出 with 块时,自动删除 lock_file,允许其他进程获取锁。

3. 关键特性

特性说明
跨进程安全适用于多进程环境(而 threading.Lock 仅限同一进程内)。
阻塞机制默认阻塞直到锁可用(可通过 timeout 参数设置超时)。
原子性操作锁文件创建是原子操作,避免竞态条件。
兼容性在 Unix/Windows 上均有效(依赖文件系统特性)。

4. 对比其他锁方案

方案缺点FileLock 优势
threading.Lock仅限同一进程的线程间同步。支持跨进程。
fcntl.flockWindows 不支持。跨平台。
手动创建锁文件需要处理异常和清理,易出错。自动管理锁生命周期。

5. 在代码中的实际意义

  • 缓存一致性:确保所有进程看到的 bgem3.json 是完整版本,避免:
  • 丢失新增的 new_cache 数据。
  • 读取到部分写入的损坏 JSON。
  • 性能权衡:虽然锁会引入短暂等待,但避免了 API 重复调用(网络开销远大于文件锁开销)。

6. 扩展建议

  • 锁超时:可添加 timeout 避免死锁:
with FileLock(lock_file, timeout=10):# 最多等待10秒
  • 异常处理:捕获 Timeout 异常并回退:
try:
with FileLock(lock_file, timeout=5):
# 操作文件
except Timeout:
print("无法获取锁,直接调用API")
return uncached_vecs

通过 FileLock,代码在多进程环境下既保持了高性能(减少 API 调用),又保证了数据安全。

http://www.lryc.cn/news/594369.html

相关文章:

  • 《镜语者》
  • RocketMQ学习系列之——MQ入门概念
  • 【基础】——股票市场基础知识宏观
  • 无 sudo 权限的环境下将 nvcc (CUDA Toolkit) 安装到个人目录 linux
  • 【c++】200*200 01灰度矩阵求所有的连通区域坐标集合
  • Numpy库,矩阵形状与维度操作
  • 本地部署 Claude 大语言模型的完整实践指南
  • 数据治理,治的是什么?
  • 建筑墙壁损伤缺陷分割数据集labelme格式7820张20类别
  • 【华为机试】169. 多数元素
  • Spring Cloud Gateway 电商系统实战指南:架构设计与深度优化
  • 最大子数组和问题-详解Kadane算法
  • 数学建模--matplot.pyplot(结尾附线条样式表格)
  • 力扣 hot100 Day50
  • 10-day07文本分类
  • Node.js:常用工具、GET/POST请求的写法、工具模块
  • 《剥开洋葱看中间件:Node.js请求处理效率与错误控制的深层逻辑》
  • Node.js worker_threads 性能提升
  • 最新轻量美化表白墙系统源码v2.0 带后台版 附搭建教程
  • RxSwift-事件属性
  • 玄机——第六章 流量特征分析-蚂蚁爱上树
  • 全面解析 JDK 提供的 JVM 诊断与故障处理工具
  • Linux之dpkg--命令的用法
  • MySQL EXPLAIN 解读
  • linux shell从入门到精通(一)——为什么要学习Linux Shell
  • 【OD机试】池化资源共享
  • 小架构step系列20:请求和响应的扩展点
  • OPC UA, CAN, PROFINET, SOCKET, MODBUS, HTTP, S7七种物联网常用协议解释
  • 2.组合式API知识点(1)
  • 【并集查找 二分图】P6185 [NOI Online #1 提高组] 序列|省选-