封装portalocker配方,便于使用
项目描述
概述
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f |
|
MD5 | b6b9d372351f2df6b2c62315f9cb8b87 |
|
BLAKE2b-256 | edd3c6c64067759e87af98cc668c1cc75171347d0f1577fab7ca3749134e3cd4 |
portalocker-2.10.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf |
|
MD5 | 3ad37408a781c56ab55c3ae0b0c6651c |
|
BLAKE2b-256 | 9bfba70a4214956182e0d7a9099ab17d50bfcba1056188e9b14f35b9e2b62a0d |