跳转到主要内容

封装portalocker配方,便于使用

项目描述

Linux Test Status Windows Tests Status Coverage Status

概述

Portalocker是一个提供简单API进行文件锁定的库。

需要注意的是,在Linux和Unix系统中,锁默认是咨询性的。通过指定挂载命令的-o mand选项,可以在Linux上启用强制文件锁定。然而,这通常不建议使用。关于此主题的更多信息

该模块目前由Rick van Hattem维护 <Wolph@wol.ph>。项目位于https://github.com/WoLpH/portalocker 。可以在此处提交错误和功能请求。补丁也非常欢迎。

安全联系方式

要报告安全漏洞,请使用Tidelift安全联系方式。Tidelift将协调修复和披露。

Redis锁

这个库现在提供了一个基于Redis的锁,允许跨多个线程、进程,甚至是跨多台计算机的分布式锁。

这是一个基于pubsub的极其可靠的Redis锁。

与基于键/值对的Redis锁定系统不同,此锁定方法基于pubsub系统。其优点是,如果由于网络问题、崩溃进程等原因连接被杀死,它将立即解锁,而不是等待锁定超时。

首先确保一切安装正确

pip install "portalocker[redis]"

使用非常简单

import portalocker

lock = portalocker.RedisLock('some_lock_channel_name')

with lock:
    print('do something here')

API基本上与其它Lock类相同,因此除了使用with语句外,还可以使用lock.acquire(...)

Python 2

在Portalocker 2.0之前的版本中支持Python 2。如果您仍在使用Python 2,可以运行以下命令进行安装

pip install "portalocker<2"

提示

在某些网络文件系统中,在关闭文件之前可能需要强制执行os.fsync(),以确保文件实际写入后再由其他客户端读取。实际上,这相当于

with portalocker.Lock('some_file', 'rb+', timeout=60) as fh:
    # do what you need to do
    ...

    # flush and sync to filesystem
    fh.flush()
    os.fsync(fh.fileno())

示例

为了确保您的缓存生成脚本不会竞争,请使用Lock

>>> import portalocker
>>> with portalocker.Lock('somefile', timeout=1) as fh:
...     print('writing some stuff to my cache...', file=fh)

要自定义打开和锁定,也可以采取手动方法

>>> import portalocker
>>> file = open('somefile', 'r+')
>>> portalocker.lock(file, portalocker.LockFlags.EXCLUSIVE)
>>> file.seek(12)
>>> file.write('foo')
>>> file.close()

在大多数情况下不需要显式解锁,但省略它已知会导致问题:https://github.com/AzureAD/microsoft-authentication-extensions-for-python/issues/42#issuecomment-601108266

如有需要,可以通过以下方式完成

>>> portalocker.unlock(file)

请注意,您的数据可能仍然在缓冲区中,因此您的数据可能只有在您调用flush()close()之前才可用。

要创建跨多个进程的跨平台有限信号量,可以使用BoundedSemaphore类,其功能与threading.BoundedSemaphore类似

>>> import portalocker
>>> n = 2
>>> timeout = 0.1
>>> semaphore_a = portalocker.BoundedSemaphore(n, timeout=timeout)
>>> semaphore_b = portalocker.BoundedSemaphore(n, timeout=timeout)
>>> semaphore_c = portalocker.BoundedSemaphore(n, timeout=timeout)
>>> semaphore_a.acquire()
<portalocker.utils.Lock object at ...>
>>> semaphore_b.acquire()
<portalocker.utils.Lock object at ...>
>>> semaphore_c.acquire()
Traceback (most recent call last):
  ...
portalocker.exceptions.AlreadyLocked

更多示例可以在测试中找到。

版本控制

该库遵循语义版本控制

变更日志

每个版本都有一个带有提交信息的git标签,解释了添加了什么和/或改变了什么。包括提交信息的标签/版本列表可以在此处找到:https://github.com/WoLpH/portalocker/releases

许可证

请参阅LICENSE文件。

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

portalocker-2.10.1.tar.gz (40.9 kB 查看哈希值)

上传时间

构建分发

portalocker-2.10.1-py3-none-any.whl (18.4 kB 查看哈希值)

上传时间 Python 3

由以下支持