Bash 双循环的并行化

Bash parallelization for double for loop

所以我有一个请求 REST API 的函数,它接受两个参数:实例和日期。我得到了一个实例列表和需要用两个 for 循环迭代的日期范围。一个约束是一次只能请求一个实例。

我尝试过使用 &wait,我的伪代码如下所示。

for each date:
    for each instance:
        do-something "$date" "$instance" &
    done
    wait
done 

这实际上非常有效,因为一次只请求一个实例,并且只有在处理完所有实例后才会进行,因此不会同时请求任何实例。

问题是对某个实例的某些请求需要很长时间,因此其他较早处理的实例处于空闲状态。我怎么解决这个问题?

定义一个函数,它将按顺序处理每个日期的给定实例:

for_each_date () {
    instance=
    shift
    for d in "$@"; do
        some_command "$d" "$instance"
    done
}

现在,为每个实例生成一个后台进程 运行 此函数。

dates=(2015-07-21 2015-07-22 2015-07-23)  # For example
instances=(inst1 inst2 inst3)

for instance in "${instances[@]}"; do
    for_each_date "$instance" "${dates[@]}" &
done
wait

每个后台作业将 运行 some-command 用于不同的实例,并且一次绝不会 运行 多个进程,因此您满足了第一个限制条件。同时,for_each_date 在旧请求完成后立即为其实例启动新请求,让您的机器尽可能忙碌。

使用 GNU Parallel 你会做:

parallel do-something ::: d a t e s ::: i n s t a n c e s