gpt4 book ai didi

python - 如何在获取避免竞争的独占锁时打开(如果不存在则创建)文件

转载 作者:太空狗 更新时间:2023-10-29 12:14:18 26 4
gpt4 key购买 nike

在 python 2.7 中,是否有可能(以及如何)在单个原子(无竞争)操作中:

  • 打开一个文件
    • 如果不存在,则创建然后打开。
  • 获取文件的独占锁(没有其他进程可以打开或删除文件)

上下文:我有一个 python 程序,它会在给定 URL/md5 列表的情况下获取文件;如果列表中的一个文件存在并且它是 md5 匹配的,它将被跳过。如果没有,它将被下载。现在,该程序可能有多个实例处理可能重叠的不同列表。

This question这几乎是我需要做的,但在我的情况下,我需要以任何一种方式锁定文件以检查它的 md5,同时防止其他人也这样做。另外,我不需要在操作之前知道文件是否存在;如果它是刚刚创建的,则该文件将为空并且它的 md5 将不匹配,因此无论如何都会下载它。

我专门在 Linux 上使用这个程序,但欢迎使用跨平台解决方案。


编辑:最后我通过以下方式解决了我的问题:

  • 以 a+b 模式打开文件(非原子模式,如果不存在则创建)。
  • 尝试独占锁定文件(建议):
    • 如果成功,处理文件。
    • 如果失败,假设其他人正在处理该文件并跳到下一个。在没有更多文件要处理后,回来检查锁定文件的人是否做对了工作。

就目前而言,单个原子步骤不支持所需的操作,但也不需要。

最佳答案

不,作为 Linux/UNIX 支持的基本操作是不可能的。

the answer you referenced 中的 O_CREAT|O_EXCL 技术可以在这里工作。您不是独占地创建目标文件,而是独占地创建一个锁定文件,其名称可预测地从目标文件派生。例如,os.path.join("/tmp", hashlib.md5(target_filename).hexdigest() + ".lock")

但是,正如其他人所建议的那样,不清楚您是否需要同时保护目标文件创建及其校验和以及可能的替换。 fcntl 建议锁将满足您的需要。

关于python - 如何在获取避免竞争的独占锁时打开(如果不存在则创建)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30954990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com