【问题标题】:Multiple parallel processes writing to the same file on SGE cluster多个并行进程写入 SGE 集群上的同一文件
【发布时间】:2020-04-15 14:52:53
【问题描述】:

我目前正在开发一个 SGE 集群,并且我的代码可以并行提交许多用 python 编写的作业。

我的代码末尾的输出是一组包含数字数据的文件。每个 python 作业执行一些计算,然后依次输出到每个文件。为了输出到文件,我的代码读入文件中的数据,将它计算的内容添加到数据中,然后输出回文件。

我的问题是这样的;因为所有作业都是并行运行的,并且所有作业都对每个输出文件都有贡献;我的工作相互冲突。我经常收到有关不兼容文件大小等的错误。我认为原因是有时两个作业会在同一时间尝试读取文件并发生冲突。

我的问题是:当并行运行(可能很多)多个作业时,每个作业都多次贡献于同一个文件,是否有一种好的做法可以确保它们不会同时尝试写入文件?这个问题有pythonic或SGE解决方案吗?

我天真的想法是有一个 txt 文件,其中包含一个 10 指示当前是否正在访问文件,并且只有当值设置为 @987654324 时作业才会写入文件@,并在输出时将值更改为1。这是一种不好的做法吗?/愚蠢的想法?

【问题讨论】:

标签: python file file-io sungridengine


【解决方案1】:

确保跨多个线程(即在同一进程中并行运行的任务)的安全性的常见做法是使用mutex。由于这将在多个进程中运行,因此需要在进程之外获取锁。

您所描述的解决方案是锁定机制的精简版。您可以存储一个值或一个文件,例如通过创建file1.txt.lock 锁定file1.txt 并确保在写入file1.txt 之前不存在此类文件。

但是,由于这是一个常见问题,因此已经有多种文件锁定机制可用,包括在 python 中。

根据this 的帖子,您可以像这样获取文件锁:

from filelock import FileLock

with FileLock("myfile.txt.lock"):
    print("Lock acquired.")
    with open("myfile.txt"):
        # work with the file as it is now locked

请查看 cmets 和其他答案,以找到替代解决方案,以最佳方式获取您特定需要的文件的锁定。

【讨论】:

  • 我明白了!我很高兴发现解决方案也与我的想法相似!我使用 filelock 的主要障碍是我的代码在我无法控制的 conda 环境中运行,因此我可能无法导入 filelock 模块。但如果我理解正确的话,我可以自己做一个文件并检查它吗?
  • 是的,你知道如何确保一次只写一个是正确的!如果您无法安装filelock,您可以仅使用标准库模块自行实现。请参阅this 帖子了解如何创建锁定文件(如果存在则失败)。
  • 太棒了!啊,真是太有用了!再次感谢!
【解决方案2】:

您可以通过让每个并行进程写入单独的文件来保持设计简单。然后,当所有流程都完成后,让最终流程收集所有结果并将它们合并到一个输出文件中。这是 HPC 处理管道的常见模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2019-07-27
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多