因此,我有一个请求REST API的函数,该函数接受两个参数:实例和日期。我得到了一个实例列表和一个日期范围,需要使用两个for循环进行迭代。一个约束是一次只能请求一个实例。
我尝试使用&
和wait
,并且我的伪代码如下所示。
for each date:
for each instance:
do-something "$date" "$instance" &
done
wait
done
这实际上是完美的,因为一次只请求一个实例,并且只有在处理完所有实例后才进行,因此不会同时请求任何实例。
问题是,某些实例的某些请求会花费很长时间,因此之前处理过的其他实例处于空闲状态。我怎么解决这个问题?
定义一个将按顺序处理每个日期的给定实例的函数:
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
在旧实例完成后立即开始对其实例发起新请求,以使您的计算机尽可能保持忙碌状态。
使用GNU Parallel,您会做:
parallel do-something ::: d a t e s ::: i n s t a n c e s