Python多进程同步——文件锁

这篇具有很好参考价值的文章主要介绍了Python多进程同步——文件锁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多个进程共享同一份资源(共享内存、文件等)时,会涉及到资源竞争问题。为了解决这种问题,一般采取的措施是进程在访问资源前加锁保护,避免多个进程同时读写。本文介绍的Python文件锁可以用来解决多进程的同步问题。


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。
Python多进程同步——文件锁
用这种方法得到以下使用例程。

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

filelock fcntl
可以设置阻塞超时时长 可以设置阻塞和非阻塞,没有超时机制
上锁后不能访问文件 在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)

以上两个进程同时运行,可以确保操作互不干扰。文章来源地址https://www.toymoban.com/news/detail-450904.html

到了这里,关于Python多进程同步——文件锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux文件数据同步--实现文件共享与备份(nfs+rsync+httpd+dns)

    目录 实验目地: 实验需求: 各项服务位置以及作用: 整体实验过程: 详细配置: Rsync服务: Web服务:  NFS服务 DNS服务 在整体实验中,使客户机在网页可以看到由服务器A上传的文件,并且A服务器有一台备份服务器。 四台虚拟服务器与一台客户机,并关闭防火墙 服务器

    2024年02月03日
    浏览(49)
  • 在Python中优雅地用多进程:进程池 Pool、管道通信 Pipe、队列通信 Queue、共享内存 Manager Value

    Python 自带的多进程库 multiprocessing 可实现多进程。我想用这些短例子示范如何优雅地用多线程。中文网络上,有些人只是翻译了旧版的 Python 官网的多进程文档。而我这篇文章会额外讲一讲下方加粗部分的内容。 创建进程 Process, fork 直接继承资源,所以初始化更快,spawn 只

    2024年02月16日
    浏览(41)
  • Python共享文件 - Python快速搭建HTTP web服务实现文件共享并公网远程访问

    转载自内网穿透工具的文章:Python一行代码实现文件共享【内网穿透公网访问】 数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有广泛的应用,对于个人用户也有很强的实用意义。也正因如此,大量数据共享软件被开发出来,云存储的概念也被重复炒作。

    2024年02月05日
    浏览(48)
  • 【Python共享文件】——Python快速搭建HTTP web服务实现文件共享并公网远程访问

    数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有广泛的应用,对于个人用户也有很强的实用意义。也正因如此,大量数据共享软件被开发出来,云存储的概念也被重复炒作。对于爱好折腾的笔者来说,用最简单的工具找寻私人共享和存储解决方案,也是

    2024年02月05日
    浏览(44)
  • 【python】socket-传输多个文件、大文件

    看过挺多个发文件的例子,但是基本都是发单个,且是 发完连接就结束了 最近正好需要 一个连接 发送 多个文件 ,根据需求产生以下内容 涉及知识点:socket 的客户端和服务端应用、json、TCP粘包处理 【客户端】获取文件信息 必备:大小 可选:文件名、文件绝对路径 【客户

    2024年02月14日
    浏览(45)
  • python 合并多个excel文件

    使用 openpyxl 思路: 读取n个excel的文件,存储在一个二维数组中,注意需要转置。 将二维数组的数据写入excel。 安装软件: 源代码: 效果截图: 使用 pandas 思路: 读取n个excel的文件,存储在一个二维数组中,注意需要转置。 将二维数组的数据写入excel。 安装软件: 源代码

    2024年02月14日
    浏览(43)
  • 使用Python合并多个Excel文件

    合并Excel可以将多个文件中的数据合并到一个文件中,这样可以帮助我们更好地汇总和管理数据。日常工作中,合并Excel主要有以下两种需求: 将多个Excel文件合并为一个文件 将多个Excel工作表合并为一个工作表 这篇文章将介绍如何使用第三方Python库 Spire.XLS for Python 实现以上

    2024年02月05日
    浏览(44)
  • python创建多个logging日志文件

    为每一个计算过程创建一个单独的日志文件,并写入对应的结果,同时保留控制台输出的功能,控制台输出与日志文件记录可以分开单独控制。 控制台输出结果  日志文件输出

    2024年02月13日
    浏览(41)
  • 【工程实践】python 合并多个csv文件

            处理数据时,有多个csv文件需要合并。有两个方法可以实现,第一个是可以通过python提供的pandas模块,借助 pd.concat()实现多个csv文件的合并。第二个是通过linux命令实现。 1-1 获得全部csv文件路径 1-2  查看数据 1-3 合并数据 2-1 合并数据         将所有的csv文件

    2024年02月11日
    浏览(76)
  • Python中跨越多个文件使用全局变量

    这个琐碎的指南是关于在 Python 中跨多个文件使用全局变量。但是在进入主题之前,让我们简单地看看全局变量和它们在多个文件中的用途。 Python 中的全局变量 全局变量是不属于函数范围的变量,可以在整个程序中使用。这表明全局变量也可以在函数体内部或外部使用。 让

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包