Python多进程同步——文件锁

news2024/9/29 9:47:00

多个进程共享同一份资源(共享内存、文件等)时,会涉及到资源竞争问题。为了解决这种问题,一般采取的措施是进程在访问资源前加锁保护,避免多个进程同时读写。本文介绍的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 True
    except Exception as e:
        return False

def tryUnLock(f) :
    try :
        fcntl.flock(f, fcntl.LOCK_UN)
        return True
    except Exception as e:
        return False

f = 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 time

def tryLock(locker, timeout = 3):
    try:
        locker.acquire(timeout)
        return True
    except Exception as e:
        return False

def tryUnLock(locker):
    try:
        locker.release()
        return True
    except Exception as e:
        return False

locker = 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上锁的区别:

filelockfcntl
可以设置阻塞超时时长可以设置阻塞和非阻塞,没有超时机制
上锁后不能访问文件在LOCK_EX 独占锁模式下,当前进程可以读写文件
需要自行安装Python自带的标准库

3.1 filelock的使用场景

filelock在上锁之后不能访问文件,那么它有什么用呢?
在应用中可以把filelock上锁的文件作为进程间同步的标志物,比如以下例子:
tryLock和tryUnLock使用的是第二节例程的。

进程一

locker = FileLock('lock_file')
while True:
    if tryLock(locker) == True:
		## operate1
		tryUnLock(locker)

进程二

locker = FileLock('lock_file')
while True:
    if tryLock(locker) == True:
		## operate2
		tryUnLock(locker)

以上两个进程同时运行,可以确保操作互不干扰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天荒地老修仙功-第六部第二篇:Spring Cloud Eureka自我保护机制

Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消…

[SCTF2019]babyre 题解

对未来的真正慷慨,是把一切献给现在。 ——加缪 目录 1.查壳 2.处理花指令,找到main函数 这一操作过程可以参考下面的视频: 3.静态分析第一部分,psword1 4.静态分析第二部分,psword2 5.静态分析第五部分,psword3 6.根据ps…

国产Linux操作系统读写RFID、NFC、IC卡示例源码

Windows系统应该是我们接触最多、最为熟悉的电脑端操作系统。Windows操作系统只能安装在x86指令集的CPU电脑中,x64是x86的升级版,Intel、Amd是x86指令集CPU最大的2个生产商。Windows系统下,外设接口驱动一般都封装成DLL动态库内,通…

基于springboot开发众筹平台前后台管理系统【完整源码+数据库+运行指导】

一、项目简介 本项目是一套基于springboot开发众筹平台前后台管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试&#…

2023csoj寒假训练10

csoj寒假训练10 A 并查集 两个黑球之间距离不够这个白球通过的话,视为一个集合 考虑怎样维护这样两两之间的关系,我们使用并查集 同时黑球与直线的关系也要做一次维护 最后可以直接判断是否上下两条直线是否在一个集合里面 如果在一个集合里面说明…

Spring容器演示——采用Spring配置文件管理Bean

一、创建Maven项目 创建Maven项目 - SpringDemo,设置项目位置以及组ID 修改项目的Maven配置 二、添加Spring依赖 在Maven仓库里查找Spring框架(https://mvnrepository.com) 查看Spring Core 选择版本 - 5.3.25 添加到pom.xml文件的元…

盘点程序员都不一定知道的小众网站!建议收藏,java编程必备!

俗话说的好,有一个趁手的工具解决了80%的疑虑。作为智慧物种的新新人类,手上掌握一两个不为人知的好用网站已经是件稀疏平常的事情。 今天我们就一起来看看,有哪些小众网站是程序员必备的! 业内人士都知道,一直劈里啪…

windows下面安装Python和pip终极教程

Python的语言风格很nice,但是这门语言对于windows并不算很友好,因为如果是初学者在windows环境下安装,简直是折磨人,会遇到各种蛋疼的情况。本文希望提供傻瓜式的教程,能够令读者成功安装Python和pip。 第一步&#xf…

什么是push通知栏消息?

我是3y,一年CRUD经验用十年的markdown程序员👨🏻‍💻常年被誉为职业八股文选手 今天继续更新Austin,给Austin新增一个发送渠道(PUSH通知栏推送) Push通知栏消息是非常常见的,几乎每…

【elementUI】自定义封装el-upload上传内容

文章目录为实现如图所示功能&#xff0c;点击第一步弹出模态框&#xff0c;第二部将所有文件导入&#xff0c;第三步点击确定的时候上传到后台接口&#xff0c;封装一个组件 1.搭建template <div style"display: inline-block; margin-left: 10px;"><el-bu…

leaflet 设置多个marker,导出为一个geojson文件(066)

第066个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中使用L.marker设置多个markers, 通过数据重组,导出为geojson文件。 这里面 ayer instanceof L.Marker 是一个很重要的判断条件,可以灵活地去运用。 直接复制下面的 vue+openlayers源代码,操作2分钟即可…

Ubuntu20.04LTS设置DNS解析(解决系统重启DNS不生效的问题)

文章目录背景介绍解决方案背景介绍 近期买了一台戴尔的工作站&#xff0c;搭建的是Ubuntu20.04系统&#xff0c;使用时发现Ubuntu20.04系统上网经常卡顿&#xff08;上网方式是有线网&#xff0c;使用的千兆网口和千兆网线&#xff09;。 使用网速测试工具speedtest-cli进行了…

redis五大数据结构

目录1.1 Redis数据结构-动态字符串1.2 Redis数据结构-intset1.3 Redis数据结构-Dict1.4 Redis数据结构-ZipList1.5 Redis数据结构-ZipList的连锁更新问题1.6 Redis数据结构-QuickList1.7 Redis数据结构-SkipList1.8 Redis数据结构-RedisObject2.0 Redis数据结构-String2.1 Redi…

前端性能优化的整理笔记

&#x1f6b4; 前言大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库&#x1f3c4;利用碎片化的时间&#xff0c;系统的整理&#xff0c;性能优化的知识点。&#x1f3af; 前端性能优化&#xf…

初识网络原理,关于网络编程的基础

一.网络的重要性对于程序员而言&#xff0c;几乎所程序都依赖于网络&#xff0c;对于公司来说&#xff0c;几乎所有产品也是依赖于网络&#xff0c;这些产品不仅包括面向用户的产品&#xff0c;公司内部的一些服务也是基于公司内网来进行相互调用的。二.组网方式①基于网线直连…

每日学术速递2.15

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.YOWOv2: A Stronger yet Efficient Multi-level Detection Framework for Real-time Spatio-temporal Action Detection 标题&#xff1a;YOWOv2&#xff1a;用于实时时空动作检测的…

Jenkins构建项目和tomcat项目发布脚编写本详细教程jenkins 2.361版本

jenkins部署教程可查看上一篇文档jenkins部署指定任意版本和配置详细教程 jenkins 2.361版本示例_争取不加班&#xff01;的博客-CSDN博客Jenkins服务器去拉取代码&#xff0c;所以要下载git客户端 yum -y install git jenkins服务器下载下面就是构建发布任务测试可以性测试使用…

第一个Python程序-HelloWorld与Python解释器

数据来源 01 第一个Python程序-HelloWorld 1&#xff09;打开cmd&#xff1a; windows R 打开运行窗口输入cmd 2&#xff09;进入Python编写页面 输入&#xff1a;python 3&#xff09;然后输入要写的Python代码然后回车 print("Hello World!!!") print() …

利用AxhubCharts元件库在Axure RP中快速创建可视化统计图

利用AxhubCharts元件库在Axure RP中快速创建可视化统计图&#xff0c;可创建的可视化统计图有折线图、柱状图、堆叠柱状图、条形图、堆叠条形图、面积图、饼图、环形图、漏斗图、甘特图、散点图等。具体操作步骤见下文。 1.下载AxhubCharts.rplib元件库文件 2.载入AxhubChart…

【Node.js】模块化

模块化模块化的基本概念模块化规范Node.js中模块化分类模块作用域向外共享模块作用域的成员Node.js中的模块化规范模块化的基本概念 指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程对于整个系统来说&#xff0c;模块是可组合&#xff0c;分解和更换…