我有一个Python脚本,该脚本应为要调用的外部程序生成一堆输入。对外部程序的调用将通过slurm。
我希望脚本等待所有生成的对外部程序的调用完成(而不是slurm命令,即外部程序的实际执行),然后解析外部程序生成的输出,执行一些数据。
我尝试了子流程调用,但是它仅等待slurm提交命令。有什么建议吗?
答案 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