当前位置: 首页 > 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.dtcms.com/a/288710.html

相关文章:

  • 如何实战优化SEO关键词提升百度排名?
  • 前端的测试
  • C++中vector的iterator迭代器的理解
  • C++ 编译链接机制的演化路径
  • 牛客NC14893 栈和排序(贪心 + 栈 + 后缀最大值维护)
  • 【机器学习|学习笔记】详解支持向量机(Support Vector Machine,SVM)为何要引入核函数?为何对缺失数据敏感?
  • 深入解析Hadoop中的EditLog与FsImage持久化设计及Checkpoint机制
  • Hadoop小文件合并技术深度解析:HAR文件归档、存储代价与索引结构
  • LeetCode|Day20|9. 回文数|Python刷题笔记
  • IP协议介绍
  • Linux: rsync+inotify实时同步及rsync+sersync实时同步
  • Leetcode 710. 黑名单中的随机数
  • 使用 Pyecharts 绘制精美饼状图:从基础到高级技巧
  • PDF 编辑器:多文件合并 拆分 旋转 顺序随便调 加水印 密码锁 页码背景
  • 微服务雪崩防护最佳实践之sentinel
  • Java 大视界 -- Java 大数据在智能安防门禁系统中的权限动态管理与安全审计(353)
  • 嵌入式硬件篇---舵机(示波器)
  • 测试学习之——Pytest Day4
  • python中读取 Excel 表格数据
  • 将EXCEL或者CSV转换为键值对形式的Markdown文件
  • 推荐一款基于.NET的进程间通信框架
  • 【橘子分布式】gRPC(编程篇-下)
  • 基于SHAP的特征重要性排序与分布式影响力可视化分析
  • ZooKeeper学习专栏(一):分布式协调的核心基石
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • 智能驾驶整体技术架构详解
  • OPC UA, CAN, PROFINET, SOCKET, MODBUS, HTTP, S7七种物联网常用协议解释
  • Shell脚本-tee工具
  • 《计算机网络》实验报告三 UDP协议分析
  • DAY 20 奇异值分解(SVD)