使用 n 个核心并行执行 bash for 循环

使用 n 个核心并行执行 bash for 循环

我有一个bash如下循环:

for i in $(seq 0 $max); do
    my_command $i
done

我想在n核心上并行运行它。我知道我可以这样做

while [[ "$j" -le "$max" ]]; do
    for i in $(seq 1 $ncores); do
        my_command $j &
    done
    wait
done

但是如果my_command的运行时间与 成线性关系$i,那么我就是在等待运行时间最长的函数,从而浪费 CPU 周期。我如何才能不断调度新作业,以便$ncores作业在任何给定时间运行?我是否需要在我的机器上本地运行实际的作业调度程序torque来实现这一点,还是可以使用简单的脚本来完成bash

答案1

使用 GNU Parallel:

seq 0 $max | parallel my_command {}

答案2

或者使用 xargs:

seq 1 $max | xargs -n1 -P$ncores -I% mycommand %

看看它是如何工作的:

seq 1 9 | shuf | xargs -n1 -P3 -I% sh -c 'echo start %; sleep %; echo stop %'

相关内容