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

问题描述 投票:0回答:2

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

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

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

我的问题是:当并行运行(可能有多个)多个作业,每个作业多次贡献给同一文件时,是否有一种好的实践方法来确保它们不尝试同时写入文件?是否有针对此问题的任何pythonic或SGE解决方案?

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

python file file-io sungridengine
2个回答
0
投票

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

您所描述的解决方案是锁定机制的精简版。您可以存储值或文件,例如通过创建file1.txt来锁定file1.txt.lock,并确保在写入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

[请查看注释和其他答案,以找到有关如何最好地为您的特定需求获取文件锁的替代解决方案。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.