多个并行进程写入 SGE 集群上的同一文件

Multiple parallel processes writing to the same file on SGE cluster

我目前正在 SGE 集群上工作,并且有代码可以并行提交许多作业,这些作业是用 python 编写的。

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

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

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

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

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

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

之前不存在这样的文件

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

根据 this post 你可以像这样获取文件锁:

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

请查看评论和其他答案,找到替代解决方案,了解如何根据您的特定需要最好地获取文件锁。

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