Python多进程同步——文件锁
多个进程共享同一份资源(共享内存、文件等)时,会涉及到资源竞争问题。为了解决这种问题,一般采取的措施是进程在访问资源前加锁保护,避免多个进程同时读写。本文介绍的Python文件锁可以用来解决多进程的同步问题。
目录
- 1 Linux下的Python文件锁
- 2 Windows下的Python文件锁
- 3 总结
- 3.1 filelock的使用场景
- 进程一
- 进程二
1 Linux下的Python文件锁
Linux下使用文件锁用到了fcntl模块,该模块是标准库,用来对文件描述符执行文件控制和I/O控制。
fcntl的文件锁用到了fcntl.flock(fd, operation)方法,它的官方说明如下:
对文件描述符fd执行锁定操作。
如果flock()失败,将引发OSError异常。
参数含义:
fd:要锁定的文件的描述符。
operation:操作类型,有以下三种。
| 类型 | 描述 |
|---|---|
| LOCK_UN | 解锁 |
| LOCK_SH | 获取共享锁,所有进程都只能读,不能写 |
| LOCK_EX | 获取独占锁,只有当前进程可以读写 |
| LOCK_NB | 非阻塞,加锁失败或成功都立即返回,如果不加这个参数,函数会一直阻塞,直到拿到锁。 |
用法:
def tryLock(f) :try :fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)return Trueexcept Exception as e:return Falsedef tryUnLock(f) :try :fcntl.flock(f, fcntl.LOCK_UN)return Trueexcept Exception as e:return Falsef = open('file.txt', 'w+')
if tryLock(f) == True:f.write('1234')tryUnLock(f)
flock函数在执行失败时,会抛出异常,所以要用try-except来捕捉,避免flock的时候程序退出。
fcntl模块支持在独占模式下写文件。
2 Windows下的Python文件锁
Windows版本的Python没有提供fcntl模块,它使用文件锁时使用的是filelock模块,需要自己安装。
打开命令行安装。
pip install filelock
虽然没找到filelock的官方文档,但可以通过dir函数来看它有些什么方法。
import filelock
print(dir(filelock))
输出。
['AcquireReturnProxy', 'BaseFileLock', 'FileLock', 'SoftFileLock',
'Timeout', 'UnixFileLock', 'WindowsFileLock', '_FileLock', '__all__',
'__annotations__', '__builtins__', '__cached__', '__doc__', '__file__',
'__loader__', '__name__', '__package__', '__path__', '__spec__',
'__version__', '_api', '_error', '_soft', '_unix', '_util', '_windows',
'annotations', 'has_fcntl', 'sys', 'version', 'warnings']
Python里形如__xxx__的一般都是私有成员。
没有直接提供方法,但从中能看到一个FileLock类和__path__路径,打印一下。
import filelock
print(dir(filelock.FileLock))
print(filelock.__path__)
输出。
['__abstractmethods__', '__call__', '__class__', '__del__',
'__delattr__', '__dict__', '__dir__', '__doc__', '__enter__',
'__eq__', '__exit__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__init_subclass__', '__le__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__',
'__str__', '__subclasshook__', '__weakref__', '_abc_impl', '_acquire',
'_recreate_cm', '_release', 'acquire', 'is_locked', 'lock_file', 'release', 'timeout']['D:\\xxx\\xxx\\xxx\\site-packages\\filelock']
FileLock提供了acquire、is_locked、release、timeout。按照名称,acquire和release是上锁和解锁的方法,timeout是上锁的超时限制。
进入__path__所在目录,用vscode的全局搜索分别找到FileLock、acquire、release、timeout。

用这种方法得到以下使用例程。
from filelock import FileLock
import timedef tryLock(locker, timeout = 3):try:locker.acquire(timeout)return Trueexcept Exception as e:return Falsedef tryUnLock(locker):try:locker.release()return Trueexcept Exception as e:return Falselocker = FileLock('file.txt')
if tryLock(locker, 0.1) == True:time.sleep(5)tryUnLock(locker)
filelock同样是通过抛出异常来表示上锁失败。
filelock模块在上锁状态下不允许写文件。
filelock支持在Linux环境下使用。
3 总结
在Linux环境下可以用fcntl或者filelock模块来实现文件锁功能,而在Windows环境下只能用filelock。
fcntl和filelock上锁的区别:
| filelock | fcntl |
|---|---|
| 可以设置阻塞超时时长 | 可以设置阻塞和非阻塞,没有超时机制 |
| 上锁后不能访问文件 | 在LOCK_EX 独占锁模式下,当前进程可以读写文件 |
| 需要自行安装 | Python自带的标准库 |
3.1 filelock的使用场景
filelock在上锁之后不能访问文件,那么它有什么用呢?
在应用中可以把filelock上锁的文件作为进程间同步的标志物,比如以下例子:
tryLock和tryUnLock使用的是第二节例程的。
进程一
locker = FileLock('lock_file')
while True:if tryLock(locker) == True:## operate1tryUnLock(locker)
进程二
locker = FileLock('lock_file')
while True:if tryLock(locker) == True:## operate2tryUnLock(locker)
以上两个进程同时运行,可以确保操作互不干扰。
相关文章:
Python多进程同步——文件锁
多个进程共享同一份资源(共享内存、文件等)时,会涉及到资源竞争问题。为了解决这种问题,一般采取的措施是进程在访问资源前加锁保护,避免多个进程同时读写。本文介绍的Python文件锁可以用来解决多进程的同步问题。 目录…...
实现 element-plus 表格多选时按 shift 进行连选的功能
前言 element-plus表格提供了多选功能,可单击勾选一条数据,可全选。 现在有个很合理的需求,希望实现类似于文件系统中shift连续选择功能,并且在表格排序后,依照排序后的顺序连选。 一、el-table 多选表格基本使用 1、…...
华为OD机试真题JAVA实现【考古学家】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明示例二输入输出说明...
Spring3之基于Aspect实现AOP
简介 使用 Aspect 搭配 Spring 可轻松实现 AOP;本章将通过一个完整示例演示如何实现这一功能 实现步骤 修改 beans.xml 配置文件的 schema 部分;可以在 spring-framework-reference.html 文件通过搜索关键字 “/aop” 找到配置 schema,然后…...
buctoj-寒假集训进阶训练赛(二十二)
问题 A: Stones 题目描述 由于自行车状态错误,森普尔开始每天早上从东到西走,每天晚上走回去。走路可能会有点累,所以森普这次总是玩一些游戏。 路上有很多石头,当他遇到一块石头时,如果是他遇到的奇数石头࿰…...
华为OD机试真题JAVA实现【静态扫描最优成本】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出描述示例一输入输出说明示例二输入输出说明...
汽车装配工厂立库物料运送线PLC无线应用
一、应用背景此次项目地在比亚迪的西安工厂,需要实现PLC无线通讯的地方是汽车厂的立体仓库物料运输线。生产物流担负运输、存储、装卸物料等任务。汽车制造业是典型的多工种、多工艺、多物料的大规模生产过程,因此原材料与零部件必需及时准确送至工位&am…...
Python雪花代码
前言 用python画个雪花玩玩,源码在文末公众号哈。 雪花类 class Snow(): #雪花类 def __init__(self): self.r 6 #雪花的半径 self.x ra.randint(-1000,1000) #雪花的横坐标 self.y ra.randint(-500,5…...
Numpy基础与实例——人工智能基础
文章目录一、Numpy概述1. 优势2. numpy历史3. Numpy的核心:多维数组4. 内存中的ndarray对象4.1 元数据(metadata)4.2 实际数据二、numpy基础1. ndarray数组2. arange、zeros、ones、zeros_like3. ndarray对象属性的基本操作3.1 修改数组维度3…...
MQTT的工作原理
介绍MQTT协议的消息模型,消息传输过程,消息发布和订阅。 一、介绍MQTT协议的消息模型 MQTT协议的消息模型被称为“主题”模型。在这种模型中,服务器接收到的消息将通过主题进行分类。客户端可以通过订阅一个或多个主题来接收所需的消息。 1.1 消息主题 1.2 消息内容 1.…...
iOS开发:UINavigationController自定义返回按钮,系统导航支持侧滑返回
当你使用系统导航想拦截用户返回事件时,无法拦截侧滑返回 当你自定义导航或者隐藏导航后,iOS系统导航的侧滑返回就失效了,那么用户体验将大打折扣 网上大部分自定义导航的解决方案是:给页面添加全局的轻扫手势,那么又区别于原生系统,改变了用户的操作习惯 在开发过程中,…...
【Kafka进阶】-- unclean.leader.election.enable参数的内涵
一、背景近期,我们的kafka 消息队列集群(1.x版本)经过了一次事故。某节点意外宕机,导致 log 文件损坏,重启 kafka 失败,最后导致某个 topic 的分区不可用,本文对此做了简单的分析、解决和复现参考,以此为记…...
基于redis实现分布式锁
前言 我们的系统都是分布式部署的,日常开发中,秒杀下单、抢购商品等等业务场景,为了防⽌库存超卖,都需要用到分布式锁。 分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或…...
C#开发的OpenRA动态加载插件DLL里的类实现
C#开发的OpenRA动态加载插件DLL里的类实现 由于这款游戏的设计是为了开源设计, 并且可以让不同个人或团体实现自己的游戏, 那么每个人实现的代码是不一样的,算法也是不一样的。 并且可能也拿不到代码一起编译生成一套运行的代码。 这时候,就要考虑使用动态加载类的功能。 意…...
网站代理是什么?有什么需要注意的?
如今,网站代理已经成为一种不可或缺的经营方式。无论是企业还是个人,都需要通过代理来获得更多的流量和市场份额。 一、网站代理的优势 网站代理的优势在于能够为您提供更加专业、周到的服务。这些优势包括:1.丰富的内容资源,能…...
动态库和静态库的区别
什么是库文件 一般来说,一个程序,通常都会包含目标文件和若干个库文件。经过汇编得到的目标文件再经过和库文件的链接,就能构成可执行文件。库文件像是一个代码仓库或代码组件的集合,为目标文件提供可直接使用的变量、函数、类等…...
C/C++路径去除前缀
在做一些日志输出的工作时,想要获取当前文件名,而不是冗长的文件路径。路径获取往往和各家os底层函数优化。C/C标准中定义了一些预处理宏,可以帮助我们获取文件路径。我们希望能够在编译期而不是在运行期做这个事情,避免额外的性能…...
Vue2之Vue-cli应用及组件基础认识
Vue2之Vue-cli应用及组件基础认识一、Vue-cli1、单页面应用程序2、vue-cli介绍3、安装和使用4、创建项目4.1 输入创建项目4.2 选择第三项,进行自主配置,按回车键即可4.3 选择自己需要的库4.4 选择Vue的版本4.5 选择CSS选择器4.6 选择Babel、ESLint、etc等…...
C 学习笔记 —— 声明、定义、初始化
文章目录声明定义初始化定义和初始化的区别静态变量初始化自动变量初始化声明 说明符表达式列表 int a; char j, k l;定义 一般的情况下,我们把建立空间的声明称之为定义,而把不需要建立存储空间的声明称之为声明。 int tern 1; //定义int main() {…...
机械狗控制算法
一. MIT Cheetah特点 1.驱动器 Cheetah 2采用了定制的本体感受驱动器设计,具有高冲击缓解、力控制和位置控制能力。这种设计使其能够自主跳过障碍物,并以6m/s的高速跳跃,但其运动范围有限,只能进行矢状面运动。 Cheetah 3采用高扭…...
科学可视化入门:用OptiX 9.0 + SDL2 + OpenGL搭建你的第一个实时渲染窗口
科学可视化实战:从零构建OptiX 9.0实时渲染系统 光线追踪技术正在重塑科学可视化的未来。想象一下,你能够实时操控分子结构中的每一个原子,或者让宇宙射线在指尖流淌——这正是OptiX 9.0与SDL2/OpenGL组合带来的可能性。本文将带你跨越理论到…...
Depth Pro:重新定义单目深度估计的速度与精度边界
Depth Pro:重新定义单目深度估计的速度与精度边界 【免费下载链接】ml-depth-pro Depth Pro: Sharp Monocular Metric Depth in Less Than a Second. 项目地址: https://gitcode.com/gh_mirrors/ml/ml-depth-pro 技术原理:如何让机器真正"看…...
GEO2R数据下载太慢?试试这个国内镜像加速方案(附完整基因注释流程)
GEO数据下载加速与基因注释全流程实战指南 引言:为什么我们需要国内镜像方案 如果你曾经尝试从GEO数据库下载大型数据集,大概率经历过那种令人抓狂的等待——进度条像蜗牛爬行,下载速度以KB/s计算,甚至中途频繁断开。这不是你的网…...
ORCAD TCL脚本菜单化加载与性能调优实践
1. ORCAD TCL脚本菜单化加载的必要性 作为一名在电子设计自动化领域摸爬滚打多年的工程师,我深刻理解ORCAD用户在使用TCL脚本时遇到的痛点。当你的脚本库逐渐壮大,每次启动ORCAD都要自动加载几十个脚本文件,那种等待的煎熬简直让人抓狂。我曾…...
手把手教你用ZPL指令在Zebra打印机上打印动态条码(附完整代码示例)
手把手教你用ZPL指令在Zebra打印机上打印动态条码(附完整代码示例) 在物流仓储、零售结算和智能制造场景中,自动生成并打印条码标签是提升作业效率的关键环节。Zebra打印机凭借其工业级稳定性和ZPL语言的高效指令集,成为行业标配…...
破局与重构:基于“智慧大脑”的企业全面数据化经营深度解构(PPT)
“在数字时代,企业最大的风险不是数据的匮乏,而是决策依然依赖经验直觉而非数据驱动。” —— 这份《数字化建设企业经营解决方案》文档,不仅是一份技术蓝图,更是对传统企业经营管理模式的一次彻底颠覆。它描绘了一个从“人治”迈…...
TOPSIS算法实战:用Python给河流水质排个名,附完整代码与避坑指南
TOPSIS算法实战:用Python给河流水质排个名,附完整代码与避坑指南 当环保部门拿到一份包含含氧量、PH值、细菌数、水草量等指标的河流水质数据时,如何科学评估各条河流的健康状况?传统的主观评分方法往往存在偏差,而TOP…...
驱动中阻塞相关函数的基础
wait_queue_head_t定义等待队列头#include <linux/wait.h> /** lock:自旋锁,用于保护队列操作(如添加/删除等待项)的并发安全* head:链表头,指向等待队列项的链表*/ typedef struct wait_queue_head …...
如何使用设计模式-误区
通过学习设计模式,可以使软件开发人员的面向对象分析和设计的能力得到很大的拓展和加强,即使编程人员还没有直接使用设计模式,只要真正用心理解了设计模式,那么软件开发人员的设计水平也将得到很大的提高。当然,学习设…...
Android SELinux权限调试实战:从avc denied到te文件修复
1. 初识SELinux权限问题:从avc denied开始 第一次看到avc denied日志时,我盯着那行红字足足愣了五分钟。当时正在调试一个需要访问系统目录的App,突然就蹦出来这么一段: avc: denied { write } for comm"com.test" name…...
