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

2024-04-23 18:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前在一个SGE集群上工作,有一段代码可以并行提交许多用python编写的作业

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

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

我的问题是:当并行运行(可能有许多)多个作业时,每个作业都会多次对同一个文件作出贡献,是否有一种良好的实践方法来确保它们不会同时写入文件?这个问题有什么pythonic或SGE解决方案吗

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


Tags: 文件数据方法代码作业集群原因数字
2条回答

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

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

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

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

根据thispost,您可以获得如下文件锁定:

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

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

相关问题 更多 >