Python等待Slurm工作?

时间:2018-08-14 09:32:28

标签: python slurm

我有一个Python脚本,该脚本应为要调用的外部程序生成一堆输入。对外部程序的调用将通过slurm。

我希望脚本等待所有生成的对外部程序的调用完成(而不是slurm命令,即外部程序的实际执行),然后解析外部程序生成的输出,执行一些数据。

我尝试了子流程调用,但是它仅等待slurm提交命令。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

解决方案1 ​​

我建议您以较小的步骤分解您的管道,然后可以在bash脚本等中将其自动化。 首先,您生成需要通过slurm运行的所有命令。如果您将它们提交为Slurm作业数组(例如,参见here),则可以同时提交用于解析所有这些命令输出的脚本。使用slurm依赖项,您可以使作业仅在作业数组完成后才能开始。

解决方案2

您可以在python脚本中进行while循环并检查作业的状态:

import time
t = time.time()
while True:
    # Break if this takes more than some_limit
    if time.time() - t > some_limit:
        break
    # Check if the jobs are done. This could be done by
    # grep'ing squeue for your username and some tags
    # that you name your jobs
    check_for_completion()
    # Sleep for a while depending on the estimated completion time of the jobs
    time.sleep(some_time)

解决方案3

在slurm上保留N个节点,然后在此处运行脚本。这样可以避免前端混乱。我建议gnu parallel在节点上分发您的作业。

答案 1 :(得分:2)

您可以像以前尝试的那样在子进程中异步运行sbatch命令,但对sbatch使用-W或--wait命令行选项。这将导致子流程直到作业终止才返回。然后,您可以阻止主程序执行,直到所有子进程完成。另外,这还使您可以处理来自外部程序的意外返回值。有关更多信息,请参见sbatch documentation