Bash并行化for循环的循环

问题描述 投票:1回答:2

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

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

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

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

问题是,某些实例的某些请求会花费很长时间,因此之前处理过的其他实例处于空闲状态。我怎么解决这个问题?

bash performance for-loop parallel-processing wait
2个回答
1
投票

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

for_each_date () {
    instance=$1
    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在旧实例完成后立即开始对其实例发起新请求,以使您的计算机尽可能保持忙碌状态。


0
投票

使用GNU Parallel,您会做:

parallel do-something ::: d a t e s ::: i n s t a n c e s
© www.soinside.com 2019 - 2024. All rights reserved.