我有一个python脚本,它应该为要调用的外部程序生成大量输入。对外部程序的调用将通过slurm进行。
我想让我的脚本等待所有生成的对外部程序的调用完成(不是slurm命令,外部程序的实际执行),然后解析外部程序生成的输出,对数据做一些处理。
我尝试了子进程调用,但它只等待slurm slurm命令。有什么建议吗?
发布于 2018-08-14 09:40:22
解决方案1
我建议将管道分成更小的步骤,然后在bash脚本中自动完成。首先,生成所有需要通过slurm运行的命令。如果将它们作为slurm作业数组(参见例如这里)提交,则可以同时提交解析所有这些命令输出的脚本。使用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并行在节点上分发作业。
发布于 2018-10-25 21:21:37
您可以像前面尝试的那样,在子进程中异步运行S批处理命令,但是对于S批处理可以使用-W或-wait命令行选项。这将导致子进程在作业结束之前不返回。然后,您可以阻止主程序的执行,直到所有子进程完成为止。作为奖励,这也将允许您处理来自外部程序的意外返回值。有关更多信息,请参见批处理文件
https://stackoverflow.com/questions/51838249
复制相似问题