并行运行shell脚本,任务数多于CPU数,任务完成后,立即占用可用位置[duplicate]

uxhixvfz  于 2023-01-26  发布在  Shell
关注(0)|答案(2)|浏览(182)
    • 此问题在此处已有答案**:

Parallelize Bash script with maximum number of processes(16个答案)
昨天关门了。
我正在并行运行一个shell脚本script.sh,它的每一行都指向一个文件夹并运行一段Fortran代码:

cd folder1 && ./code & 
cd folder2 && ./code &
cd folder3 && ./code &
cd folder4 && ./code &
..
cd folder 96 && ./code
wait 
cd folder 97 && ./code
..
..
..
cd folder2500 && ./code.sh

大约有2500个文件夹,代码输出彼此独立。我可以访问96个CPU,每个作业使用大约1%的CPU,所以我使用&键和wait命令并行运行96个作业。由于不同的原因,96个作业不是同时完成的。有些作业需要40分钟,有些需要90分钟。一个重要的区别。所以我想知道是否有可能较早完成的作业使用可用的CPU来优化执行时间。
我也尝试了GNU Parallel:
parallel -a script.sh,但它也有同样的问题,我在互联网上找不到有类似问题的人。

cs7cruho

cs7cruho1#

一种bash/wait -n方法:

jobmax=96
jobcnt=0

for ((i=1;i<=2500;i++))
do
    ((++jobcnt))
    [[ "${jobcnt}" -gt "${jobmax}" ]] && wait -n && ((--jobcnt))   # if jobcnt > 96 => wait for a job to finish, decrement jobcnt, then continue with next line ...
    ( cd "folder$i" && ./code ) &                                  # kick off new job
done

wait                                                               # wait for rest of jobs to complete

注:

  • 当作业快速完成时(例如,〈1秒),在wait -n; start new job; wait -n周期内可能会完成多个作业,在这种情况下,您一次运行的作业可能少于jobmax(即,jobcnt高于运行作业的实际数量)
  • 然而,在这种情况下,每个作业预计需要XX分钟才能完成,在wait -n; start new job; wait -n周期内完成多个作业的可能性应该大大降低(如果不能消除的话)
tjrkku2a

tjrkku2a2#

您可以使用GNU并行

parallel 'cd {} && ./code' ::: folder*

这将使您的所有核心保持忙碌,在每个作业完成时立即启动一个新作业。
如果只想并行运行48个作业,请用途:

parallel -j 48 ...

如果要进行预演并查看将运行的内容,但实际上不运行任何内容,请用途:

parallel --dry-run ...

如果要查看进度报告,请用途:

parallel --progress ...

相关问题