用于循环

时间:2015-07-31 15:23:07

标签: bash performance for-loop parallel-processing wait

所以我有一个请求REST API的函数,它接受两个参数:实例和日期。我给出了一个实例列表和一系列日期,需要使用两个for循环进行迭代。一个限制是一次只能请求一个实例。

我尝试使用&wait,我的伪代码看起来像这样。

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

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

问题是某些实例的某些请求需要很长时间,因此之前处理过的其他实例都是空闲的。我怎么解决这个问题?

2 个答案:

答案 0 :(得分: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在旧实例完成后立即为其实例启动新请求,使您的计算机尽可能保持忙碌。

答案 1 :(得分:1)

使用GNU Parallel,您可以:

'react-facebook-login/dist/facebook-login-render-props'