我需要锁定一个文件写在Python。它将被多个Python进程同时访问。我在网上找到了一些解决方案,但大多数都无法达到我的目的,因为它们通常只是基于Unix或Windows的。
当前回答
我从grizzed -python中找到了一个简单而有效的(!)实现。
简单使用os.open(…, O_EXCL) + os.close()在windows上不起作用。
其他回答
我更喜欢lockfile——平台独立的文件锁定
我一直在寻找几种解决方案,我的选择是 oslo.concurrency
它功能强大,文档也相对完善。它是基于紧固件的。
其他的解决方案:
Portalocker:需要pywin32,这是一个exe安装,所以不可能通过pip 紧固件:缺乏记录 lockfile:弃用 flufl。lock:用于POSIX系统的nfs安全文件锁定。 simpleflock:上次更新2013-07 佐。lockfile:上一次更新2016-06(截至2017-03) lock_file: 2007-10年最后一次更新
下面是一个如何使用filelock库的例子,它类似于Evan Fossmark的实现:
from filelock import FileLock
lockfile = r"c:\scr.txt"
lock = FileLock(lockfile + ".lock")
with lock:
file = open(path, "w")
file.write("123")
file.close()
with lock:块中的任何代码都是线程安全的,这意味着它将在另一个进程访问该文件之前完成。
这里有一个跨平台的文件锁定模块:Portalocker
尽管正如Kevin所说,从多个进程同时写入文件是您希望尽可能避免的事情。
如果可以将问题硬塞到数据库中,则可以使用SQLite。它支持并发访问并处理自己的锁定。
好吧,所以我最终用我在这里写的代码,在我的网站上链接是死的,在archive.org上查看(也可在GitHub上)。我可以以以下方式使用它:
from filelock import FileLock
with FileLock("myfile.txt"):
# work with the file as it is now locked
print("Lock acquired.")
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录